Public Sub Initialize()

' Control is passed to this module once all of the Descriptor information has been collected

' This module displays the information in a form as similar as Chapter 3 as possible

Call ClearDisplay

Call ParseDescriptors

' Determine which Class Descriptor, if any, is in Column 5

Display_Descriptors.Show

End Sub

Private Sub ClearDisplay()

For i% = 0 To 4

    Call DisplayNames(i%)

    Choice(i%).Clear

    Choice(i%).AddItem "Display Names"

    Choice(i%).ListIndex = 0

    Next i%

End Sub

Private Sub ParseDescriptors()

DeviceCount = 0: ConfigurationCount = 0: InterfaceCount = 0: EndpointCount = 0: ClassCount = 0

Index& = 1

Do While DescriptorData(Index&) <> 0

    Select Case DescriptorData(Index& + 1) ' What TYPE of descriptor is this?

    Case 1

    DeviceCount = DeviceCount + 1: Choice(0).AddItem "Display Values"

    Choice(0).ItemData(Choice(0).ListCount - 1) = Index&

    Case 2

    ConfigurationCount = ConfigurationCount + 1: Choice(1).AddItem "Configuration " & ConfigurationCount

    Choice(1).ItemData(Choice(1).ListCount - 1) = Index&

    Case 3

    If StringCount <> 0 Then Choice(5).AddItem "String " & TwoHexCharacters$(CByte(StringCount)) & " = " & GetString$(Index&)

    StringCount = StringCount + 1

    Case 4

    InterfaceCount = InterfaceCount + 1

    Choice(2).AddItem "Interface " & ConfigurationCount & ":" & InterfaceCount

    Choice(2).ItemData(Choice(2).ListCount - 1) = Index&

    Case 5

    EndpointCount = EndpointCount + 1

    Choice(3).AddItem "Endpoint " & ConfigurationCount & ":" & EndpointCount

    Choice(3).ItemData(Choice(3).ListCount - 1) = Index&

    Case Else ' Must be a Class Descriptor

    ClassCount = ClassCount + 1

    Choice(4).AddItem "Class(" & TwoHexCharacters$(CByte(DescriptorData(Index& + 1))) & ") " & ConfigurationCount & ":" & ClassCount

    Choice(4).ItemData(Choice(4).ListCount - 1) = Index&

    End Select

    Index& = Index& + DescriptorData(Index&)

    Loop

' Fill out the default data for the Descriptors

For i% = 0 To 4

    If Choice(i%).ListCount = 1 Then ' descriptor type is not present, remove from display

        Choice(i%).Visible = False: Descriptor(i%).Visible = False

        Else ' fill with data

        Choice(i%).ItemData(0) = Choice(i%).ItemData(1)

        Call AddDescriptorData(i%, 0)

        End If

    Next i%

If StringCount = 0 Then Choice(5).Visible = False

End Sub

Private Function GetString$(Index&) ' Extract UNICODE string from Descriptor

Length& = DescriptorData(Index&) - 2

temp$ = "": For i& = 2 To Length& + 1 Step 2: temp$ = temp$ + Chr$(DescriptorData(Index& + i&)): Next i&

GetString$ = temp$

End Function

Private Sub Descriptor_Click(DescriptorID%)

' If a user clicks on a TEXT entry then this text is replaced with it's current VALUE

Selection& = Descriptor(DescriptorID%).ListIndex

Descriptor(DescriptorID%).List(Selection&) = TwoHexCharacters(Descriptor(DescriptorID%).ItemData(Selection&))

End Sub

Private Sub Choice_Click(DescriptorID%)

' If a user changes the SELECTION then the corresponding Descriptor DISPLAY must be updated

If DescriptorID% <> 5 Then

    Selection& = Choice(DescriptorID%).ListIndex

    If Selection& = 0 Then

        Call DisplayNames(DescriptorID%)

        Call AddDescriptorData(DesciptorID%, 0)

    Else

        Call AddDescriptorData(DescriptorID%, Selection&)

        Call DisplayDescriptor(DescriptorID%, Selection&)

        End If 'Selection& = 0

    End If 'DescriptorID% <> 5

End Sub

Public Sub AddDescriptorData(DescriptorID%, Selection&)

' This subroutine updates the ITEMDATA of DISPLAY with the corresponding VALUES

Index& = Choice(DescriptorID%).ItemData(Selection&)

Length& = Descriptor(DescriptorID%).ListCount

For i& = 0 To Length& - 1

    Descriptor(DescriptorID%).ItemData(i&) = DescriptorData(Index& + i&)

    Next i&

End Sub

Public Sub DisplayDescriptor(DescriptorID%, Selection&)

' This subroutine replaces Descriptor TEXT with Descriptor VALUES

Length& = Descriptor(DescriptorID%).ListCount

For i& = 0 To Length& - 1

    Descriptor(DescriptorID%).List(i&) = TwoHexCharacters$(Descriptor(DescriptorID%).ItemData(i&))

    Next i&

End Sub

Public Sub DisplayNames(DescriptorID%)

' This subroutine clears the Descriptor then copies TEXT to the DISPLAY

Descriptor(DescriptorID%).Clear

Descriptor(DescriptorID%).AddItem "        Length"

Descriptor(DescriptorID%).AddItem "         Type"

Select Case DescriptorID%

Case 0 'Device

    Descriptor(0).AddItem "          USB"

    Descriptor(0).AddItem "       Version"

    Descriptor(0).AddItem "        Class"

    Descriptor(0).AddItem "       SubClass"

    Descriptor(0).AddItem "       Protocol"

    Descriptor(0).AddItem "       EP0_Size"

    Descriptor(0).AddItem "        Vendor"

    Descriptor(0).AddItem "             ID"

    Descriptor(0).AddItem "        Product"

    Descriptor(0).AddItem "             ID"

    Descriptor(0).AddItem "       Version"

    Descriptor(0).AddItem "        Number"

    Descriptor(0).AddItem "  iManufacturer"

    Descriptor(0).AddItem "  iProductName"

    Descriptor(0).AddItem "       iSerial#"

    Descriptor(0).AddItem " Configurations"

Case 1 'Configuration

    Descriptor(1).AddItem "         Total"

    Descriptor(1).AddItem "        Length"

    Descriptor(1).AddItem "      Interfaces"

    Descriptor(1).AddItem "      ThisConfig."

    Descriptor(1).AddItem "     ConfigName"

    Descriptor(1).AddItem "      Attributes"

    Descriptor(1).AddItem "     Max.Power"

Case 2 'Interface

    Descriptor(2).AddItem "   ThisInterface"

    Descriptor(2).AddItem "      Alternate"

    Descriptor(2).AddItem "      Endpoints"

    Descriptor(2).AddItem "          Class"

    Descriptor(2).AddItem "      SubClass"

    Descriptor(2).AddItem "      Protocol"

    Descriptor(2).AddItem " InterfaceName"

Case 3 'Endpoint

    Descriptor(3).AddItem "   ThisEndpoint"

    Descriptor(3).AddItem "      Attributes"

    Descriptor(3).AddItem "     Max. Packet"

    Descriptor(3).AddItem "            Size"

    Descriptor(3).AddItem " Polling Interval"

Case 4 ' Class.  Display will depend upon which Class

'    x = Descriptor(4).ItemData(1) 'Type

'    Select Case x

'    Case 33 'HID

        Descriptor(4).AddItem "Param3"

        Descriptor(4).AddItem "Param4"

        Descriptor(4).AddItem "Param5"

        Descriptor(4).AddItem "Param6"

        Descriptor(4).AddItem "Param7"

        Descriptor(4).AddItem "Param8"

        Descriptor(4).AddItem "Param9"

'    End Select

End Select

End Sub