168 lines
5.2 KiB
C++
168 lines
5.2 KiB
C++
/*****************************************************************************
|
|
|
|
USB-Example: User defined USB device
|
|
V1.0.0
|
|
|
|
(c) 2011 Reusch Elektronik, Dipl.-Ing. (FH) Rainer Reusch
|
|
Homepage: http://products.reworld.eu/index.htm
|
|
|
|
Main Form
|
|
|
|
Borland C++Builder 6
|
|
|
|
Created: 2011-05-30
|
|
Changed: 2011-05-30
|
|
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
This example uses the "LibUSB-Win32" library and driver collection, to communicate
|
|
with the USB device.
|
|
The example shows, how to use control transfers for the own usage.
|
|
It defines two additional endpoints for bulk transfer (write and read) of data.
|
|
*/
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include <vcl.h>
|
|
#pragma hdrstop
|
|
|
|
#include "UnitMain.h"
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
#pragma resource "*.dfm"
|
|
TFormMain *FormMain;
|
|
//---------------------------------------------------------------------------
|
|
|
|
__fastcall TFormMain::TFormMain(TComponent* Owner)
|
|
: TForm(Owner)
|
|
{
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
usb_dev_handle * TFormMain::open_dev(void)
|
|
// open USB device with defined VID and PID
|
|
{
|
|
struct usb_bus *bus;
|
|
struct usb_device *dev;
|
|
|
|
for (bus = usb_get_busses(); bus; bus = bus->next) {
|
|
for (dev = bus->devices; dev; dev = dev->next) {
|
|
if ((dev->descriptor.idVendor==MY_VID)&&(dev->descriptor.idProduct==MY_PID)) {
|
|
return usb_open(dev);
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::FormCreate(TObject *Sender)
|
|
{
|
|
// USB initializations
|
|
dev=0;
|
|
usb_init(); // initialize the library
|
|
usb_find_busses(); // find all busses
|
|
usb_find_devices(); // find all connected devices
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::FormCloseQuery(TObject *Sender, bool &CanClose)
|
|
{
|
|
ButtonCloseClick(Sender);
|
|
CanClose=true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::FormDestroy(TObject *Sender)
|
|
{
|
|
//
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::ButtonOpenClick(TObject *Sender)
|
|
// open USB device
|
|
{
|
|
dev=open_dev();
|
|
if (dev) {
|
|
usb_set_configuration(dev, 1); // select 1st USB configuration
|
|
StatusBar1->SimpleText="USB device opened";
|
|
} else
|
|
StatusBar1->SimpleText="opening failed";
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::ButtonVersionClick(TObject *Sender)
|
|
// user defined control transfer
|
|
{
|
|
#define CONTROLBUFSIZE 16 // USB buffer size for control transfers
|
|
#define USER_REQUESTTYPE 0xC3 // a user defined request type with response (means, no standard request)
|
|
#define USER_REQUESTVERSION 0x01 // a self defined request: get version info
|
|
int r;
|
|
char buf[CONTROLBUFSIZE];
|
|
AnsiString s;
|
|
|
|
if (dev) {
|
|
r=usb_control_msg(dev,USER_REQUESTTYPE,USER_REQUESTVERSION,0,1,(char *)(&buf),sizeof(buf),100);
|
|
if (r>0) {
|
|
s.SetLength(strlen(buf));
|
|
strcpy(s.c_str(),buf);
|
|
LabelVersion->Caption=s;
|
|
StatusBar1->SimpleText="version info received";
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::ButtonTransferClick(TObject *Sender)
|
|
// transfer data to device and receive response
|
|
// (bulk transfer via user defined endpoints)
|
|
{
|
|
#define BUFSIZE 32 // USB buffer size (= max. data size for one data block)
|
|
#define EP_TODEVICE 0x01 // endpoint for data to device (OUT)
|
|
#define EP_FROMDEVICE 0x82 // endpoint for data from device (IN)
|
|
char buf[BUFSIZE];
|
|
int r;
|
|
AnsiString s;
|
|
|
|
if (dev) {
|
|
strcpy(buf,LabeledEdit1->Text.c_str());
|
|
usb_claim_interface(dev, 0); // select interface 0
|
|
r=usb_bulk_write(dev,EP_TODEVICE,buf,sizeof(buf),100); // output data
|
|
if (r>0) { // data was transmitted successfully, now wait for response
|
|
Sleep(100);
|
|
r=usb_bulk_read(dev,EP_FROMDEVICE,(char *)&buf,sizeof(buf),100);
|
|
if (r>0) { // data received from device
|
|
s.SetLength(strlen(buf));
|
|
strcpy(s.c_str(),buf);
|
|
LabelData->Caption=s;
|
|
StatusBar1->SimpleText="data sent and received";
|
|
} else { // error
|
|
LabelData->Caption="(no response)";
|
|
StatusBar1->SimpleText="no response from device";
|
|
}
|
|
}
|
|
usb_release_interface(dev, 0); // close pipe
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::ButtonCloseClick(TObject *Sender)
|
|
// close USB device
|
|
{
|
|
if (dev) {
|
|
usb_close(dev);
|
|
dev=NULL;
|
|
StatusBar1->SimpleText="USB device closed";
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TFormMain::ButtonExitClick(TObject *Sender)
|
|
// exit program
|
|
{
|
|
Close();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|