frmMain.frm
上传用户:gaoyannt
上传日期:2007-01-09
资源大小:62k
文件大小:27k
源码类别:

USB编程

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Begin VB.Form frmMain 
  3.    Caption         =   "USB Complete"
  4.    ClientHeight    =   4392
  5.    ClientLeft      =   252
  6.    ClientTop       =   336
  7.    ClientWidth     =   6132
  8.    LinkTopic       =   "Form1"
  9.    ScaleHeight     =   4392
  10.    ScaleWidth      =   6132
  11.    Begin VB.Timer tmrContinuousDataCollect 
  12.       Left            =   120
  13.       Top             =   3960
  14.    End
  15.    Begin VB.Frame fraSendAndReceive 
  16.       Caption         =   "Send and Receive Data"
  17.       Height          =   1692
  18.       Left            =   3960
  19.       TabIndex        =   7
  20.       Top             =   120
  21.       Width           =   2052
  22.       Begin VB.CommandButton cmdContinuous 
  23.          Caption         =   "Continuous"
  24.          Height          =   372
  25.          Left            =   360
  26.          TabIndex        =   9
  27.          Top             =   1080
  28.          Width           =   1452
  29.       End
  30.       Begin VB.CommandButton cmdOnce 
  31.          Caption         =   "Once"
  32.          Height          =   372
  33.          Left            =   360
  34.          TabIndex        =   8
  35.          Top             =   360
  36.          Width           =   1452
  37.       End
  38.    End
  39.    Begin VB.Frame fraBytesReceived 
  40.       Caption         =   "Bytes Received"
  41.       Height          =   1692
  42.       Left            =   2400
  43.       TabIndex        =   4
  44.       Top             =   120
  45.       Width           =   1452
  46.       Begin VB.TextBox txtBytesReceived 
  47.          Height          =   732
  48.          Left            =   360
  49.          MultiLine       =   -1  'True
  50.          TabIndex        =   5
  51.          Top             =   600
  52.          Width           =   732
  53.       End
  54.    End
  55.    Begin VB.Frame fraBytesToSend 
  56.       Caption         =   "Bytes to Send"
  57.       Height          =   1692
  58.       Left            =   120
  59.       TabIndex        =   1
  60.       Top             =   120
  61.       Width           =   2172
  62.       Begin VB.CheckBox chkAutoincrement 
  63.          Caption         =   "Autoincrement values"
  64.          Height          =   372
  65.          Left            =   240
  66.          TabIndex        =   6
  67.          Top             =   1200
  68.          Width           =   2412
  69.       End
  70.       Begin VB.ComboBox cboByte1 
  71.          Height          =   288
  72.          Left            =   240
  73.          Style           =   2  'Dropdown List
  74.          TabIndex        =   3
  75.          Top             =   840
  76.          Width           =   1212
  77.       End
  78.       Begin VB.ComboBox cboByte0 
  79.          Height          =   288
  80.          Left            =   240
  81.          Style           =   2  'Dropdown List
  82.          TabIndex        =   2
  83.          Top             =   360
  84.          Width           =   1212
  85.       End
  86.    End
  87.    Begin VB.Timer tmrDelay 
  88.       Enabled         =   0   'False
  89.       Left            =   120
  90.       Top             =   11400
  91.    End
  92.    Begin VB.ListBox lstResults 
  93.       Height          =   2352
  94.       Left            =   120
  95.       TabIndex        =   0
  96.       Top             =   1920
  97.       Width           =   5892
  98.    End
  99. End
  100. Attribute VB_Name = "frmMain"
  101. Attribute VB_GlobalNameSpace = False
  102. Attribute VB_Creatable = False
  103. Attribute VB_PredeclaredId = True
  104. Attribute VB_Exposed = False
  105. Option Explicit
  106. 'Project: usbhidio.vbp
  107. 'Version: 1.1
  108. 'Date: 11/20/99
  109. 'Copyright 1999 by Jan Axelson (jan@lvr.com)
  110. '
  111. 'Purpose: demonstrates USB communications with an HID-class device
  112. 'Description:
  113. 'Finds an attached device that matches specific vendor and product IDs.
  114. 'Retrieves the device's capabilities.
  115. 'Sends two bytes to the device using Input reports.
  116. 'Receives two bytes from the device in Output reports.
  117. '(For testing, the current device firmware adds 1 to the received bytes
  118. 'and sends them back.)
  119. 'A list box displays the data sent and received,
  120. 'along with error and status messages.
  121. 'Combo boxes enable you to select data to send, and to select 1-time or
  122. 'continuous transfers.
  123. 'The companion device firmware is usbhidio.asm,
  124. 'for Cypress Semiconductor's CY7C63001 USB Microcontroller.
  125. 'For more information, visit Lakeview Research at http://www.lvr.com .
  126. 'Send comments, bug reports, etc. to jan@lvr.com .
  127. 'Changes and updates:
  128. '11/20/99. Revised a few of the comments.
  129. 'v1.1 added Else statement in InitializeDisplay routine
  130. 'so both combo boxes have all of the values.
  131. Dim Capabilities As HIDP_CAPS
  132. Dim DataString As String
  133. Dim DetailData As Long
  134. Dim DetailDataBuffer() As Byte
  135. Dim DeviceAttributes As HIDD_ATTRIBUTES
  136. Dim DevicePathName As String
  137. Dim DeviceInfoSet As Long
  138. Dim ErrorString As String
  139. Dim HidDevice As Long
  140. Dim LastDevice As Boolean
  141. Dim MyDeviceDetected As Boolean
  142. Dim MyDeviceInfoData As SP_DEVINFO_DATA
  143. Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA
  144. Dim MyDeviceInterfaceData As SP_DEVICE_INTERFACE_DATA
  145. Dim Needed As Long
  146. Dim OutputReportData(7) As Byte
  147. Dim PreparsedData As Long
  148. Dim Result As Long
  149. Dim Timeout As Boolean
  150. 'Set these to match the values in the device's firmware and INF file.
  151. Const MyVendorID = &H925
  152. Const MyProductID = &H1234
  153. Function FindTheHid() As Boolean
  154. 'Makes a series of API calls to locate the desired HID-class device.
  155. 'Returns True if the device is detected, False if not detected.
  156. Dim Count As Integer
  157. Dim GUIDString As String
  158. Dim HidGuid As GUID
  159. Dim MemberIndex As Long
  160. LastDevice = False
  161. MyDeviceDetected = False
  162. '******************************************************************************
  163. 'HidD_GetHidGuid
  164. 'Get the GUID for all system HIDs.
  165. 'Returns: the GUID in HidGuid.
  166. 'The routine doesn't return a value in Result
  167. 'but the routine is declared as a function for consistency with the other API calls.
  168. '******************************************************************************
  169. Result = HidD_GetHidGuid(HidGuid)
  170. Call DisplayResultOfAPICall("GetHidGuid")
  171. 'Display the GUID.
  172. GUIDString = _
  173.     Hex$(HidGuid.Data1) & "-" & _
  174.     Hex$(HidGuid.Data2) & "-" & _
  175.     Hex$(HidGuid.Data3) & "-"
  176. For Count = 0 To 7
  177.     'Ensure that each of the 8 bytes in the GUID displays two characters.
  178.     If HidGuid.Data4(Count) >= &H10 Then
  179.         GUIDString = GUIDString & Hex$(HidGuid.Data4(Count)) & " "
  180.     Else
  181.         GUIDString = GUIDString & "0" & Hex$(HidGuid.Data4(Count)) & " "
  182.     End If
  183. Next Count
  184. lstResults.AddItem "  GUID for system HIDs: " & GUIDString
  185. '******************************************************************************
  186. 'SetupDiGetClassDevs
  187. 'Returns: a handle to a device information set for all installed devices.
  188. 'Requires: the HidGuid returned in GetHidGuid.
  189. '******************************************************************************
  190. DeviceInfoSet = SetupDiGetClassDevs _
  191.     (HidGuid, _
  192.     vbNullString, _
  193.     0, _
  194.     (DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE))
  195.     
  196. Call DisplayResultOfAPICall("SetupDiClassDevs")
  197. DataString = GetDataString(DeviceInfoSet, 32)
  198. '******************************************************************************
  199. 'SetupDiEnumDeviceInterfaces
  200. 'On return, MyDeviceInterfaceData contains the handle to a
  201. 'SP_DEVICE_INTERFACE_DATA structure for a detected device.
  202. 'Requires:
  203. 'the DeviceInfoSet returned in SetupDiGetClassDevs.
  204. 'the HidGuid returned in GetHidGuid.
  205. 'An index to specify a device.
  206. '******************************************************************************
  207. 'Begin with 0 and increment until no more devices are detected.
  208. MemberIndex = 0
  209. Do
  210.     'The cbSize element of the MyDeviceInterfaceData structure must be set to
  211.     'the structure's size in bytes. The size is 28 bytes.
  212.     MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData)
  213.     Result = SetupDiEnumDeviceInterfaces _
  214.         (DeviceInfoSet, _
  215.         0, _
  216.         HidGuid, _
  217.         MemberIndex, _
  218.         MyDeviceInterfaceData)
  219.     
  220.     Call DisplayResultOfAPICall("SetupDiEnumDeviceInterfaces")
  221.     If Result = 0 Then LastDevice = True
  222.     
  223.     'If a device exists, display the information returned.
  224.     If Result <> 0 Then
  225.         lstResults.AddItem "  DeviceInfoSet for device #" & CStr(MemberIndex) & ": "
  226.         lstResults.AddItem "  cbSize = " & CStr(MyDeviceInterfaceData.cbSize)
  227.         lstResults.AddItem _
  228.             "  InterfaceClassGuid.Data1 = " & Hex$(MyDeviceInterfaceData.InterfaceClassGuid.Data1)
  229.         lstResults.AddItem _
  230.             "  InterfaceClassGuid.Data2 = " & Hex$(MyDeviceInterfaceData.InterfaceClassGuid.Data2)
  231.         lstResults.AddItem _
  232.             "  InterfaceClassGuid.Data3 = " & Hex$(MyDeviceInterfaceData.InterfaceClassGuid.Data3)
  233.         lstResults.AddItem _
  234.             "  Flags = " & Hex$(MyDeviceInterfaceData.Flags)
  235.     
  236.         
  237.         '******************************************************************************
  238.         'SetupDiGetDeviceInterfaceDetail
  239.         'Returns: an SP_DEVICE_INTERFACE_DETAIL_DATA structure
  240.         'containing information about a device.
  241.         'To retrieve the information, call this function twice.
  242.         'The first time returns the size of the structure in Needed.
  243.         'The second time returns a pointer to the data in DeviceInfoSet.
  244.         'Requires:
  245.         'A DeviceInfoSet returned by SetupDiGetClassDevs and
  246.         'an SP_DEVICE_INTERFACE_DATA structure returned by SetupDiEnumDeviceInterfaces.
  247.         '*******************************************************************************
  248.         
  249.         MyDeviceInfoData.cbSize = Len(MyDeviceInfoData)
  250.         Result = SetupDiGetDeviceInterfaceDetail _
  251.            (DeviceInfoSet, _
  252.            MyDeviceInterfaceData, _
  253.            0, _
  254.            0, _
  255.            Needed, _
  256.            0)
  257.         
  258.         DetailData = Needed
  259.             
  260.         Call DisplayResultOfAPICall("SetupDiGetDeviceInterfaceDetail")
  261.         lstResults.AddItem "  (OK to say too small)"
  262.         lstResults.AddItem "  Required buffer size for the data: " & Needed
  263.         
  264.         'Store the structure's size.
  265.         MyDeviceInterfaceDetailData.cbSize = _
  266.             Len(MyDeviceInterfaceDetailData)
  267.         
  268.         'Use a byte array to allocate memory for
  269.         'the MyDeviceInterfaceDetailData structure
  270.         ReDim DetailDataBuffer(Needed)
  271.         'Store cbSize in the first four bytes of the array.
  272.         Call RtlMoveMemory _
  273.             (DetailDataBuffer(0), _
  274.             MyDeviceInterfaceDetailData, _
  275.             4)
  276.         
  277.         'Call SetupDiGetDeviceInterfaceDetail again.
  278.         'This time, pass the address of the first element of DetailDataBuffer
  279.         'and the returned required buffer size in DetailData.
  280.         Result = SetupDiGetDeviceInterfaceDetail _
  281.            (DeviceInfoSet, _
  282.            MyDeviceInterfaceData, _
  283.            VarPtr(DetailDataBuffer(0)), _
  284.            DetailData, _
  285.            Needed, _
  286.            0)
  287.         
  288.         Call DisplayResultOfAPICall(" Result of second call: ")
  289.         lstResults.AddItem "  MyDeviceInterfaceDetailData.cbSize: " & _
  290.             CStr(MyDeviceInterfaceDetailData.cbSize)
  291.         
  292.         'Convert the byte array to a string.
  293.         DevicePathName = CStr(DetailDataBuffer())
  294.         'Convert to Unicode.
  295.         DevicePathName = StrConv(DevicePathName, vbUnicode)
  296.         'Strip cbSize (4 bytes) from the beginning.
  297.         DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4)
  298.         lstResults.AddItem "  Device pathname: "
  299.         lstResults.AddItem "    " & DevicePathName
  300.                 
  301.         '******************************************************************************
  302.         'CreateFile
  303.         'Returns: a handle that enables reading and writing to the device.
  304.         'Requires:
  305.         'The DevicePathName returned by SetupDiGetDeviceInterfaceDetail.
  306.         '******************************************************************************
  307.     
  308.         HidDevice = CreateFile _
  309.             (DevicePathName, _
  310.             GENERIC_READ Or GENERIC_WRITE, _
  311.             (FILE_SHARE_READ Or FILE_SHARE_WRITE), _
  312.             0, _
  313.             OPEN_EXISTING, _
  314.             0, _
  315.             0)
  316.             
  317.         Call DisplayResultOfAPICall("CreateFile")
  318.         lstResults.AddItem "  Returned handle: " & Hex$(HidDevice) & "h"
  319.         
  320.         'Now we can find out if it's the device we're looking for.
  321.         
  322.         '******************************************************************************
  323.         'HidD_GetAttributes
  324.         'Requests information from the device.
  325.         'Requires: The handle returned by CreateFile.
  326.         'Returns: an HIDD_ATTRIBUTES structure containing
  327.         'the Vendor ID, Product ID, and Product Version Number.
  328.         'Use this information to determine if the detected device
  329.         'is the one we're looking for.
  330.         '******************************************************************************
  331.         
  332.         'Set the Size property to the number of bytes in the structure.
  333.         DeviceAttributes.Size = LenB(DeviceAttributes)
  334.         Result = HidD_GetAttributes _
  335.             (HidDevice, _
  336.             DeviceAttributes)
  337.             
  338.         Call DisplayResultOfAPICall("HidD_GetAttributes")
  339.         If Result <> 0 Then
  340.             lstResults.AddItem "  HIDD_ATTRIBUTES structure filled without error."
  341.         Else
  342.             lstResults.AddItem "  Error in filling HIDD_ATTRIBUTES structure."
  343.         End If
  344.     
  345.         lstResults.AddItem "  Structure size: " & DeviceAttributes.Size
  346.         lstResults.AddItem "  Vendor ID: " & Hex$(DeviceAttributes.VendorID)
  347.         lstResults.AddItem "  Product ID: " & Hex$(DeviceAttributes.ProductID)
  348.         lstResults.AddItem "  Version Number: " & Hex$(DeviceAttributes.VersionNumber)
  349.         
  350.         'Find out if the device matches the one we're looking for.
  351.         If (DeviceAttributes.VendorID = MyVendorID) And _
  352.             (DeviceAttributes.ProductID = MyProductID) Then
  353.                 lstResults.AddItem "  My device detected"
  354.                 MyDeviceDetected = True
  355.         Else
  356.                 MyDeviceDetected = False
  357.                 'If it's not the one we want, close its handle.
  358.                 Result = CloseHandle _
  359.                     (HidDevice)
  360.                 DisplayResultOfAPICall ("CloseHandle")
  361.         End If
  362. End If
  363.     'Keep looking until we find the device or there are no more left to examine.
  364.     MemberIndex = MemberIndex + 1
  365. Loop Until (LastDevice = True) Or (MyDeviceDetected = True)
  366. If MyDeviceDetected = True Then
  367.     FindTheHid = True
  368. Else
  369.     lstResults.AddItem " Device not found."
  370. End If
  371. End Function
  372. Private Function GetDataString _
  373.     (Address As Long, _
  374.     Bytes As Long) _
  375. As String
  376. 'Retrieves a string of length Bytes from memory, beginning at Address.
  377. 'Adapted from Dan Appleman's "Win32 API Puzzle Book"
  378. Dim Offset As Integer
  379. Dim Result$
  380. Dim ThisByte As Byte
  381. For Offset = 0 To Bytes - 1
  382.     Call RtlMoveMemory(ByVal VarPtr(ThisByte), ByVal Address + Offset, 1)
  383.     If (ThisByte And &HF0) = 0 Then
  384.         Result$ = Result$ & "0"
  385.     End If
  386.     Result$ = Result$ & Hex$(ThisByte) & " "
  387. Next Offset
  388. GetDataString = Result$
  389. End Function
  390. Private Function GetErrorString _
  391.     (ByVal LastError As Long) _
  392. As String
  393. 'Returns the error message for the last error.
  394. 'Adapted from Dan Appleman's "Win32 API Puzzle Book"
  395. Dim Bytes As Long
  396. Dim ErrorString As String
  397. ErrorString = String$(129, 0)
  398. Bytes = FormatMessage _
  399.     (FORMAT_MESSAGE_FROM_SYSTEM, _
  400.     0&, _
  401.     LastError, _
  402.     0, _
  403.     ErrorString$, _
  404.     128, _
  405.     0)
  406.     
  407. 'Subtract two characters from the message to strip the CR and LF.
  408. If Bytes > 2 Then
  409.     GetErrorString = Left$(ErrorString, Bytes - 2)
  410. End If
  411. End Function
  412. Private Sub cmdContinuous_Click()
  413. 'Enables the user to select 1-time or continuous data transfers.
  414. If cmdContinuous.Caption = "Continuous" Then
  415.     'Change the command button to Cancel Continuous
  416.     cmdContinuous.Caption = "Cancel Continuous"
  417.     'Enable the timer to read and write to the device once/second.
  418.     tmrContinuousDataCollect.Enabled = True
  419.     Call ReadAndWriteToDevice
  420. Else
  421.     'Change the command button to Continuous
  422.     cmdContinuous.Caption = "Continuous"
  423.     'Disable the timer that reads and writes to the device once/second.
  424.     tmrContinuousDataCollect.Enabled = False
  425. End If
  426. End Sub
  427. Private Sub cmdOnce_Click()
  428. Call ReadAndWriteToDevice
  429. End Sub
  430. Private Sub DisplayResultOfAPICall(FunctionName As String)
  431. 'Display the results of an API call.
  432. Dim ErrorString As String
  433. lstResults.AddItem ""
  434. ErrorString = GetErrorString(Err.LastDllError)
  435. lstResults.AddItem FunctionName
  436. lstResults.AddItem "  Result = " & ErrorString
  437. 'Scroll to the bottom of the list box.
  438. lstResults.ListIndex = lstResults.ListCount - 1
  439. End Sub
  440. Private Sub Form_Load()
  441. frmMain.Show
  442. tmrDelay.Enabled = False
  443. Call Startup
  444. End Sub
  445. Private Sub Form_Unload(Cancel As Integer)
  446. Call Shutdown
  447. End Sub
  448. Private Sub GetDeviceCapabilities()
  449. '******************************************************************************
  450. 'HidD_GetPreparsedData
  451. 'Returns: a pointer to a buffer containing information about the device's capabilities.
  452. 'Requires: A handle returned by CreateFile.
  453. 'There's no need to access the buffer directly,
  454. 'but HidP_GetCaps and other API functions require a pointer to the buffer.
  455. '******************************************************************************
  456. Dim ppData(29) As Byte
  457. Dim ppDataString As Variant
  458. 'Preparsed Data is a pointer to a routine-allocated buffer.
  459. Result = HidD_GetPreparsedData _
  460.     (HidDevice, _
  461.     PreparsedData)
  462. Call DisplayResultOfAPICall("HidD_GetPreparsedData")
  463. 'Copy the data at PreparsedData into a byte array.
  464. Result = RtlMoveMemory _
  465.     (ppData(0), _
  466.     PreparsedData, _
  467.     30)
  468. Call DisplayResultOfAPICall("RtlMoveMemory")
  469. ppDataString = ppData()
  470. 'Convert the data to Unicode.
  471. ppDataString = StrConv(ppDataString, vbUnicode)
  472. '******************************************************************************
  473. 'HidP_GetCaps
  474. 'Find out the device's capabilities.
  475. 'For standard devices such as joysticks, you can find out the specific
  476. 'capabilities of the device.
  477. 'For a custom device, the software will probably know what the device is capable of,
  478. 'so this call only verifies the information.
  479. 'Requires: The pointer to a buffer containing the information.
  480. 'The pointer is returned by HidD_GetPreparsedData.
  481. 'Returns: a Capabilites structure containing the information.
  482. '******************************************************************************
  483. Result = HidP_GetCaps _
  484.     (PreparsedData, _
  485.     Capabilities)
  486. Call DisplayResultOfAPICall("HidP_GetCaps")
  487. lstResults.AddItem "  Last error: " & ErrorString
  488. lstResults.AddItem "  Usage: " & Hex$(Capabilities.Usage)
  489. lstResults.AddItem "  Usage Page: " & Hex$(Capabilities.UsagePage)
  490. lstResults.AddItem "  Input Report Byte Length: " & Capabilities.InputReportByteLength
  491. lstResults.AddItem "  Output Report Byte Length: " & Capabilities.OutputReportByteLength
  492. lstResults.AddItem "  Feature Report Byte Length: " & Capabilities.FeatureReportByteLength
  493. lstResults.AddItem "  Number of Link Collection Nodes: " & Capabilities.NumberLinkCollectionNodes
  494. lstResults.AddItem "  Number of Input Button Caps: " & Capabilities.NumberInputButtonCaps
  495. lstResults.AddItem "  Number of Input Value Caps: " & Capabilities.NumberInputValueCaps
  496. lstResults.AddItem "  Number of Input Data Indices: " & Capabilities.NumberInputDataIndices
  497. lstResults.AddItem "  Number of Output Button Caps: " & Capabilities.NumberOutputButtonCaps
  498. lstResults.AddItem "  Number of Output Value Caps: " & Capabilities.NumberOutputValueCaps
  499. lstResults.AddItem "  Number of Output Data Indices: " & Capabilities.NumberOutputDataIndices
  500. lstResults.AddItem "  Number of Feature Button Caps: " & Capabilities.NumberFeatureButtonCaps
  501. lstResults.AddItem "  Number of Feature Value Caps: " & Capabilities.NumberFeatureValueCaps
  502. lstResults.AddItem "  Number of Feature Data Indices: " & Capabilities.NumberFeatureDataIndices
  503. '******************************************************************************
  504. 'HidP_GetValueCaps
  505. 'Returns a buffer containing an array of HidP_ValueCaps structures.
  506. 'Each structure defines the capabilities of one value.
  507. 'This application doesn't use this data.
  508. '******************************************************************************
  509. 'This is a guess. The byte array holds the structures.
  510. Dim ValueCaps(1023) As Byte
  511. Result = HidP_GetValueCaps _
  512.     (HidP_Input, _
  513.     ValueCaps(0), _
  514.     Capabilities.NumberInputValueCaps, _
  515.     PreparsedData)
  516.    
  517. Call DisplayResultOfAPICall("HidP_GetValueCaps")
  518. 'lstResults.AddItem "ValueCaps= " & GetDataString((VarPtr(ValueCaps(0))), 180)
  519. 'To use this data, copy the byte array into an array of structures.
  520. End Sub
  521. Private Sub InitializeDisplay()
  522. Dim Count As Integer
  523. Dim ByteValue As String
  524. 'Create a dropdown list box for each byte to send.
  525. For Count = 0 To 255
  526.     If Len(Hex$(Count)) < 2 Then
  527.         ByteValue = "0" & Hex$(Count)
  528.     Else
  529.         ByteValue = Hex$(Count)
  530.     End If
  531.     frmMain.cboByte0.AddItem ByteValue, Count
  532. Next Count
  533. For Count = 0 To 255
  534.     If Len(Hex$(Count)) < 2 Then
  535.         ByteValue = "0" & Hex$(Count)
  536.     Else
  537.         ByteValue = Hex$(Count)
  538.     End If
  539.     frmMain.cboByte1.AddItem ByteValue, Count
  540. Next Count
  541. 'Select a default item for each box
  542. frmMain.cboByte0.ListIndex = 0
  543. frmMain.cboByte1.ListIndex = 128
  544. End Sub
  545. Private Sub ReadAndWriteToDevice()
  546. 'Sends two bytes to the device and reads two bytes back.
  547. Dim DeviceDetected As Boolean
  548. 'Report Header
  549. lstResults.AddItem "HID Test Report"
  550. lstResults.AddItem Format(Now, "general date")
  551. 'Some data to send
  552. '(if not using the combo boxes):
  553. 'OutputReportData(0) = &H12
  554. 'OutputReportData(1) = &H34
  555. 'OutputReportData(2) = &HF0
  556. 'OutputReportData(3) = &HF1
  557. 'OutputReportData(4) = &HF2
  558. 'OutputReportData(5) = &HF3
  559. 'OutputReportData(6) = &HF4
  560. 'OutputReportData(7) = &HF5
  561. 'Get the bytes to send from the combo boxes.
  562. 'Increment the values if the autoincrement check box is selected.
  563. If chkAutoincrement.Value = 1 Then
  564.     If cboByte0.ListIndex < 255 Then
  565.         cboByte0.ListIndex = cboByte0.ListIndex + 1
  566.     Else
  567.         cboByte0.ListIndex = 0
  568.     End If
  569.     If cboByte1.ListIndex < 255 Then
  570.         cboByte1.ListIndex = cboByte1.ListIndex + 1
  571.     Else
  572.         cboByte1.ListIndex = 0
  573.     End If
  574. End If
  575. OutputReportData(0) = cboByte0.ListIndex
  576. OutputReportData(1) = cboByte1.ListIndex
  577. 'Find the device
  578. DeviceDetected = FindTheHid
  579. If DeviceDetected = True Then
  580.     'Learn the capabilities of the device
  581.     Call GetDeviceCapabilities
  582.     'Write a report to the device
  583.     Call WriteReport
  584.     
  585.     'The firmware adds 1 to each received byte and sends the bytes back
  586.     'to the host.
  587.     'Add a delay to allow the host time to poll for the returned data.
  588.     Timeout = False
  589.     tmrDelay.Interval = 100
  590.     tmrDelay.Enabled = True
  591.     Do
  592.         DoEvents
  593.     Loop Until Timeout = True
  594.     'Read a report from the device.
  595.     Call ReadReport
  596. Else
  597. End If
  598. 'Scroll to the bottom of the list box.
  599. lstResults.ListIndex = lstResults.ListCount - 1
  600. End Sub
  601. Private Sub ReadReport()
  602. 'Read data from the device.
  603. Dim Count
  604. Dim NumberOfBytesRead As Long
  605. 'Allocate a buffer for the report.
  606. 'Byte 0 is the report ID.
  607. Dim ReadBuffer() As Byte
  608. Dim UBoundReadBuffer As Integer
  609. '******************************************************************************
  610. 'ReadFile
  611. 'Returns: the report in ReadBuffer.
  612. 'Requires: a device handle returned by CreateFile,
  613. 'the Input report length in bytes returned by HidP_GetCaps.
  614. '******************************************************************************
  615. 'ReadFile is a blocking call. The application will hang until the device
  616. 'sends the requested amount of data. To prevent hanging, be sure that
  617. 'the device always has data to send.
  618. Dim ByteValue As String
  619. 'The ReadBuffer array begins at 0, so subtract 1 from the number of bytes.
  620. ReDim ReadBuffer(Capabilities.InputReportByteLength - 1)
  621.     
  622. 'Pass the address of the first byte of the read buffer.
  623. Result = ReadFile _
  624.     (HidDevice, _
  625.     ReadBuffer(0), _
  626.     CLng(Capabilities.InputReportByteLength), _
  627.     NumberOfBytesRead, _
  628.     0)
  629. Call DisplayResultOfAPICall("ReadFile")
  630. lstResults.AddItem " Report ID: " & ReadBuffer(0)
  631. lstResults.AddItem " Report Data:"
  632. txtBytesReceived.Text = ""
  633. For Count = 1 To UBound(ReadBuffer)
  634.     'Add a leading 0 to values 0 - Fh.
  635.     If Len(Hex$(ReadBuffer(Count))) < 2 Then
  636.         ByteValue = "0" & Hex$(ReadBuffer(Count))
  637.     Else
  638.         ByteValue = Hex$(ReadBuffer(Count))
  639.     End If
  640.     lstResults.AddItem " " & ByteValue
  641.     'Display the received bytes in the text box.
  642.     txtBytesReceived.SelStart = Len(txtBytesReceived.Text)
  643.     txtBytesReceived.SelText = ByteValue & vbCrLf
  644.     
  645. Next Count
  646. End Sub
  647. Private Sub Shutdown()
  648. 'Includes actions that must execute when the program ends.
  649. 'Close the open handle to the device.
  650. Result = CloseHandle _
  651.     (HidDevice)
  652. Call DisplayResultOfAPICall("CloseHandle (HidDevice)")
  653. 'Free memory used by SetupDiGetClassDevs
  654. 'Nonzero = success
  655. Result = SetupDiDestroyDeviceInfoList _
  656.     (DeviceInfoSet)
  657. Call DisplayResultOfAPICall("DestroyDeviceInfoList")
  658. Result = HidD_FreePreparsedData _
  659.     (PreparsedData)
  660. Call DisplayResultOfAPICall("HidD_FreePreparsedData")
  661. End Sub
  662. Private Sub Startup()
  663. Call InitializeDisplay
  664. tmrContinuousDataCollect.Enabled = False
  665. tmrContinuousDataCollect.Interval = 1000
  666. End Sub
  667. Private Sub tmrContinuousDataCollect_Timer()
  668. Call ReadAndWriteToDevice
  669. End Sub
  670. Private Sub tmrDelay_Timer()
  671. Timeout = True
  672. tmrDelay.Enabled = False
  673. End Sub
  674. Private Sub WriteReport()
  675. 'Send data to the device.
  676. Dim Count As Integer
  677. Dim NumberOfBytesRead As Long
  678. Dim NumberOfBytesToSend As Long
  679. Dim NumberOfBytesWritten As Long
  680. Dim ReadBuffer() As Byte
  681. Dim SendBuffer() As Byte
  682. 'The SendBuffer array begins at 0, so subtract 1 from the number of bytes.
  683. ReDim SendBuffer(Capabilities.OutputReportByteLength - 1)
  684. '******************************************************************************
  685. 'WriteFile
  686. 'Sends a report to the device.
  687. 'Returns: success or failure.
  688. 'Requires: the handle returned by CreateFile and
  689. 'The output report byte length returned by HidP_GetCaps
  690. '******************************************************************************
  691. 'The first byte is the Report ID
  692. SendBuffer(0) = 0
  693. 'The next bytes are data
  694. For Count = 1 To Capabilities.OutputReportByteLength - 1
  695.     SendBuffer(Count) = OutputReportData(Count - 1)
  696. Next Count
  697. NumberOfBytesWritten = 0
  698. Result = WriteFile _
  699.     (HidDevice, _
  700.     SendBuffer(0), _
  701.     CLng(Capabilities.OutputReportByteLength), _
  702.     NumberOfBytesWritten, _
  703.     0)
  704. Call DisplayResultOfAPICall("WriteFile")
  705. lstResults.AddItem " OutputReportByteLength = " & Capabilities.OutputReportByteLength
  706. lstResults.AddItem " NumberOfBytesWritten = " & NumberOfBytesWritten
  707. lstResults.AddItem " Report ID: " & SendBuffer(0)
  708. lstResults.AddItem " Report Data:"
  709. For Count = 1 To UBound(SendBuffer)
  710.     lstResults.AddItem " " & Hex$(SendBuffer(Count))
  711. Next Count
  712. End Sub