'############################################################################################################################################################## Dim Shared XIDUSD_Controler_TypesD() as String Dim Shared XIDUSD_Controler_TypesC as UInteger '############################################################################################################################################################## #Include Once "xidusd_usb.bi" '############################################################################################################################################################## Enum XIDUSD_ControlerInputMaskType_Enum XIDUSD_CIMT_Unknown = -1 XIDUSD_CIMT_LenCheck = -2 XIDUSD_CIMT_GET_Button_XBOX = -3 XIDUSD_CIMT_GET_Button_START = -5 XIDUSD_CIMT_GET_Button_BACK = -6 XIDUSD_CIMT_GET_Button_FOR = -7 XIDUSD_CIMT_GET_Button_SELECT = -8 XIDUSD_CIMT_GET_Button_X = -9 XIDUSD_CIMT_GET_Button_Y = -10 XIDUSD_CIMT_GET_Button_Z = -11 XIDUSD_CIMT_GET_Button_A = -12 XIDUSD_CIMT_GET_Button_B = -13 XIDUSD_CIMT_GET_Button_C = -14 XIDUSD_CIMT_GET_Button_Axis1 = -15 XIDUSD_CIMT_GET_Button_Axis2 = -16 XIDUSD_CIMT_GET_Button_Axis3 = -17 XIDUSD_CIMT_GET_Button_Axis4 = -18 XIDUSD_CIMT_GET_Button_Axis5 = -19 XIDUSD_CIMT_GET_Button_Axis6 = -20 XIDUSD_CIMT_GET_Button_Axis7 = -21 XIDUSD_CIMT_GET_Button_Axis8 = -22 XIDUSD_CIMT_GET_Button_TL = -23 XIDUSD_CIMT_GET_Button_TR = -24 XIDUSD_CIMT_GET_Button_BL = -25 XIDUSD_CIMT_GET_Button_BR = -26 XIDUSD_CIMT_GET_Button_Up = -27 XIDUSD_CIMT_GET_Button_Down = -28 XIDUSD_CIMT_GET_Button_Left = -29 XIDUSD_CIMT_GET_Button_Right = -30 XIDUSD_CIMT_GET_Axis_1 = -31 XIDUSD_CIMT_GET_Axis_2 = -32 XIDUSD_CIMT_GET_Axis_3 = -33 XIDUSD_CIMT_GET_Axis_4 = -34 XIDUSD_CIMT_GET_Axis_5 = -35 XIDUSD_CIMT_GET_Axis_6 = -36 XIDUSD_CIMT_GET_Axis_7 = -37 XIDUSD_CIMT_GET_Axis_8 = -38 XIDUSD_CIMT_GET_LED_1 = -39 XIDUSD_CIMT_GET_Button_A1 = -40 XIDUSD_CIMT_GET_Button_A2 = -41 End Enum '-------------------------------------------------------------------------------------------------------------------------------------------------------------- Type XIDUSD_ControlerInputMaskItem_Type Field = 1 V_Next as XIDUSD_ControlerInputMaskItem_Type Ptr V_Prev as XIDUSD_ControlerInputMaskItem_Type Ptr V_ByteIndex as Integer V_ByteValue as UInteger V_BitIndex as Integer End Type '-------------------------------------------------------------------------------------------------------------------------------------------------------------- Type XIDUSD_ControlerInputMask_Type Field = 1 V_Next as XIDUSD_ControlerInputMask_Type Ptr V_Prev as XIDUSD_ControlerInputMask_Type Ptr V_IsGet as Byte V_Style as Byte V_ValueType as XIDUSD_ControlerInputMaskType_Enum V_DataLen as UByte V_Min as Integer V_Max as Integer V_Invers as Integer V_Mask(0 to 255) as UByte V_Value(0 to 255) as Integer V_Type(0 to 255) as UByte V_Set(0 to 255) as Integer V_Order(0 to 255, 0 to 4) as UByte End Type '-------------------------------------------------------------------------------------------------------------------------------------------------------------- Type XIDUSD_Controler_Type V_Next as XIDUSD_Controler_Type Ptr V_Prev as XIDUSD_Controler_Type Ptr V_MarkDel as Integer V_Name as String V_Device as usb_device Ptr V_DeviceFN as usb_dev_handle Ptr V_EP_AdrW as Integer V_EP_AdrR as Integer V_UInput_FID as long V_Masks_F as XIDUSD_ControlerInputMask_Type Ptr V_Masks_L as XIDUSD_ControlerInputMask_Type Ptr End Type '-------------------------------------------------------------------------------------------------------------------------------------------------------------- Dim Shared XIDUSD_Controler_F as XIDUSD_Controler_Type Ptr Dim Shared XIDUSD_Controler_L as XIDUSD_Controler_Type Ptr '############################################################################################################################################################## #Include Once "xidusd_uinput.bi" '############################################################################################################################################################## Function XIDUSD_DevCheckExist(V_Device as usb_device Ptr) as Integer Dim TCPtr as XIDUSD_Controler_Type Ptr = XIDUSD_Controler_F Do Until TCPtr = 0 If TCPtr->V_Device = V_Device Then Return 1 TCPtr = TCPtr->V_Next Loop Return -1 End Function '############################################################################################################################################################## Function XIDUSD_DevAddXIDParseParam(ByRef RV_Mask_F as XIDUSD_ControlerInputMask_Type Ptr, ByRef RV_Mask_L as XIDUSD_ControlerInputMask_Type Ptr, V_Data as String) as Integer Dim DD() as String Dim DC as Integer Dim TPos as Integer Dim T as String = V_Data Dim T1 as String Do TPos = InStr(1, T, ";") If TPos > 0 Then T1 = Trim(Left(T, TPos - 1)) T = Trim(Mid(T, TPos + 1)) Else: T1 = T: T = "" End If If T1 <> "" Then DC += 1 Redim Preserve DD(DC) as String DD(DC) = UCase(T1) End If If T = "" Then Exit Do Loop If DC < 3 Then Return -1 Dim TIDXStart as Integer If RV_Mask_L <> 0 Then RV_Mask_L->V_Next = CAllocate(SizeOf(XIDUSD_ControlerInputMask_Type)) RV_Mask_L->V_Next->V_Prev = RV_Mask_L RV_Mask_L = RV_Mask_L->V_Next Else RV_Mask_L = CAllocate(SizeOf(XIDUSD_ControlerInputMask_Type)) RV_Mask_F = RV_Mask_L End If With *RV_Mask_L .V_IsGet = 1 TPos = InStr(1, DD(1), ",") If TPos > 0 Then T = Mid(DD(1), TPos + 1) DD(1) = Left(DD(1), TPos - 1) End If Select Case DD(1) Case "D": .V_Style = 1 Case Else Select Case DD(1) Case "A": .V_Style = 0 Case "AI": .V_Style = 0: .V_Invers = 1 Case "S": .V_Style = 2 End Select TPos = InStr(1, T, ",") If TPos <= 0 Then Return -1 T1 = Mid(T, TPos + 1) T = Left(T, TPos - 1) If Left(T, 1) = "-" Then .V_Min = -CInt("&H" & Mid(T, 2)) Else: .V_Min = CInt("&H" & T) End If If Left(T1, 1) = "-" Then .V_Max = -CInt("&H" & Mid(T1, 2)) Else: .V_Max = CInt("&H" & T1) End If End Select .V_DataLen = CUByte(DD(2)) Dim TByteSet as String Dim TByteIndex as String Dim TByteType as String Dim TByteBit as String Dim TByteValue as String Dim TByteOrder as String Dim TByteValueX as Integer For X as UInteger = 3 to DC T = DD(X) TPos = InStr(1, T, ",") If TPos > 0 Then TByteSet = Left(T, TPos - 1) T = Mid(T, TPos + 1) Else: TByteSet = "1" End If TPos = InStr(1, T, ":") If TPos = 0 Then Continue For TByteIndex = Left(T, TPos - 1) TByteValue = Mid(T, TPos + 1) TPos = InStr(1, TByteIndex, ".") If TPos > 0 Then TByteType = Mid(TByteIndex, TPos + 1, 1) TByteBit = Mid(TByteIndex, TPos + 2) TByteIndex = Left(TByteIndex, TPos - 1) Else: TByteType = "B": TByteBit = "" End If If TByteBit = "" Then TByteBit = "FF" If (CInt(TByteIndex) < 0) or (CInt(TByteIndex) > 255) Then Continue For If Left(TByteSet, 1) <> "-" Then .V_Set(CInt(TByteIndex)) = CInt("&H" & TByteSet) Else: .V_Set(CInt(TByteIndex)) = -CInt("&H" & Mid(TByteSet, 2)) End If TByteOrder = Mid(TByteType, 2) TByteType = Left(TByteType, 1) Select Case TByteType Case "B": .V_Type(CInt(TByteIndex)) = 0 Case "W": .V_Type(CInt(TByteIndex)) = 1 Case "I": .V_Type(CInt(TByteIndex)) = 2 End Select If TByteOrder <> "" Then .V_Order(CInt(TByteIndex), 0) = 1 For X as Integer = 1 to Len(TByteOrder) .V_Order(CInt(TByteIndex), X) = CUByte(Mid(TByteOrder, X, 1)) Next End If If .V_Style = 1 Then .V_Mask(CInt(TByteIndex)) = CUByte("&H" & TByteBit) Select Case TByteValue Case "LC" : TByteValueX = XIDUSD_CIMT_LenCheck Case "BUTTON_XBOX" : TByteValueX = XIDUSD_CIMT_GET_Button_XBOX Case "BUTTON_START" : TByteValueX = XIDUSD_CIMT_GET_Button_START Case "BUTTON_BACK" : TByteValueX = XIDUSD_CIMT_GET_Button_BACK Case "BUTTON_FOR" : TByteValueX = XIDUSD_CIMT_GET_Button_FOR Case "BUTTON_SELECT" : TByteValueX = XIDUSD_CIMT_GET_Button_SELECT Case "BUTTON_X" : TByteValueX = XIDUSD_CIMT_GET_Button_X Case "BUTTON_Y" : TByteValueX = XIDUSD_CIMT_GET_Button_Y Case "BUTTON_Z" : TByteValueX = XIDUSD_CIMT_GET_Button_Z Case "BUTTON_A" : TByteValueX = XIDUSD_CIMT_GET_Button_A Case "BUTTON_B" : TByteValueX = XIDUSD_CIMT_GET_Button_B Case "BUTTON_C" : TByteValueX = XIDUSD_CIMT_GET_Button_C Case "BUTTON_A1" : TByteValueX = XIDUSD_CIMT_GET_Button_A1 Case "BUTTON_A2" : TByteValueX = XIDUSD_CIMT_GET_Button_A2 Case "BUTTON_LT" : TByteValueX = XIDUSD_CIMT_GET_Button_TL Case "BUTTON_RT" : TByteValueX = XIDUSD_CIMT_GET_Button_TR Case "BUTTON_LB" : TByteValueX = XIDUSD_CIMT_GET_Button_BL Case "BUTTON_RB" : TByteValueX = XIDUSD_CIMT_GET_Button_BR Case "BUTTON_UP" : TByteValueX = XIDUSD_CIMT_GET_Button_Up Case "BUTTON_DOWN" : TByteValueX = XIDUSD_CIMT_GET_Button_Down Case "BUTTON_LEFT" : TByteValueX = XIDUSD_CIMT_GET_Button_Left Case "BUTTON_RIGHT" : TByteValueX = XIDUSD_CIMT_GET_Button_Right Case "LED_1" : TByteValueX = XIDUSD_CIMT_GET_LED_1 Case Else : TByteValueX = CInt("&H" & TByteValue) End Select .V_Value(CInt(TByteIndex)) = TByteValueX Print "D: >" & Bin(.V_Mask(CInt(TByteIndex)), 8) & "<___>" & .V_Value(CInt(TByteIndex)) & "<" Else .V_Mask(CInt(TByteIndex)) = CUByte("&H" & TByteBit) Select Case TByteValue Case "LC" : TByteValueX = XIDUSD_CIMT_LenCheck Case "AXIS_1" : TByteValueX = XIDUSD_CIMT_GET_Axis_1 Case "AXIS_2" : TByteValueX = XIDUSD_CIMT_GET_Axis_2 Case "AXIS_3" : TByteValueX = XIDUSD_CIMT_GET_Axis_3 Case "AXIS_4" : TByteValueX = XIDUSD_CIMT_GET_Axis_4 Case "AXIS_5" : TByteValueX = XIDUSD_CIMT_GET_Axis_5 Case "AXIS_6" : TByteValueX = XIDUSD_CIMT_GET_Axis_6 Case "AXIS_7" : TByteValueX = XIDUSD_CIMT_GET_Axis_7 Case "AXIS_8" : TByteValueX = XIDUSD_CIMT_GET_Axis_8 Case Else : TByteValueX = CInt("&H" & TByteValue) End Select .V_Value(CInt(TByteIndex)) = TByteValueX Print "A: >" & Bin(.V_Mask(CInt(TByteIndex)), 8) & "<___>" & .V_Type(CInt(TByteIndex)) & "<___>" & .V_Order(CInt(TByteIndex), 0) & "<___>" & .V_Value(CInt(TByteIndex)) & "<___>" & .V_Set(CInt(TByteIndex)) & "<" End If Next End With Return 1 End Function '############################################################################################################################################################## Function XIDUSD_DevAdd(V_Device as usb_device Ptr) as Integer If V_Device = 0 Then Return -1 Dim TCName as String = UCase(Hex(V_Device->descriptor.idVendor, 4)) & UCase(Hex(V_Device->descriptor.idProduct, 4)) Dim TFN as Integer = FreeFile() If Open("controler/" & TCName & ".xid" for Input as #TFN) <> 0 Then Return -1 Dim TName as String Dim T as String Dim TPos as Integer Dim TMaskF as XIDUSD_ControlerInputMask_Type Ptr Dim TMaskL as XIDUSD_ControlerInputMask_Type Ptr Do Until EOF(TFN) Line Input #TFN, T T = Trim(T) If Left(T, 1) = "#" Then Continue Do If T = "" Then Continue Do TPos = InStr(T, "=") If TPos <= 0 Then Continue Do Select Case LCase(Trim(Left(T, TPos - 1))) Case "name": TName = Trim(Mid(T, TPos + 1)) Case "get": XIDUSD_DevAddXIDParseParam(TMaskF, TMaskL, Trim(Mid(T, TPos + 1))) End Select Loop Close #TFN Dim TDevFN as usb_dev_handle Ptr = usb_open(V_Device) If TDevFN = 0 Then Return -1 If usb_set_configuration(TDevFN, 1) <> 0 Then usb_close(TDevFN): Return -1 If usb_claim_interface(TDevFN, 0) <> 0 Then usb_close(TDevFN): Return -1 With *TDevFN If .device->descriptor.bNumConfigurations <= 0 Then Print "bNumConfigurations <= 0!": Return -1 If .device->config[0].bNumInterfaces <= 0 Then Print "bNumInterfaces <= 0!": Return -1 If .device->config[0].interface[0].num_altsetting <= 0 Then Print "num_altsetting <= 0!": Return -1 If .device->config[0].interface[0].altsetting[0].bNumEndpoints <= 0 Then Print "bNumEndpoints <= 0!": Return -1 If .device->config[0].interface[0].altsetting[0].bNumEndpoints <> 2 Then Print "bNumEndpoints <> 2!": Return -1 End With If XIDUSD_Controler_L <> 0 Then XIDUSD_Controler_L->V_Next = CAllocate(SizeOf(XIDUSD_Controler_Type)) XIDUSD_Controler_L->V_Next->V_Prev = XIDUSD_Controler_L XIDUSD_Controler_L = XIDUSD_Controler_L->V_Next Else XIDUSD_Controler_L = CAllocate(SizeOf(XIDUSD_Controler_Type)) XIDUSD_Controler_F = XIDUSD_Controler_L End If With *XIDUSD_Controler_L .V_Name = TName .V_Device = V_Device .V_DeviceFN = TDevFN If .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[0].bEndpointAddress > &HF Then .V_EP_AdrR = .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[0].bEndpointAddress Else: .V_EP_AdrW = .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[0].bEndpointAddress End If If .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[1].bEndpointAddress > &HF Then .V_EP_AdrR = .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[1].bEndpointAddress Else: .V_EP_AdrW = .V_DeviceFN->device->config[0].interface[0].altsetting[0].endpoint[1].bEndpointAddress End If .V_Masks_F = TMaskF .V_Masks_L = TMaskL End With If XIDUSD_UInput_Init(XIDUSD_Controler_L) <> 1 Then Print "Cant init UInput!" End If Print "NEW DEVICE!" Return 1 End Function '############################################################################################################################################################## Function XIDUSD_DevDel(V_Controler as XIDUSD_Controler_Type Ptr) as Integer XIDUSD_UInput_Term(V_Controler) If V_Controler = 0 Then Return -1 If V_Controler->V_Next <> 0 Then V_Controler->V_Next->V_Prev = V_Controler->V_Prev If V_Controler->V_Prev <> 0 Then V_Controler->V_Prev->V_Next = V_Controler->V_Next If XIDUSD_Controler_F = V_Controler Then XIDUSD_Controler_F = V_Controler->V_Next If XIDUSD_Controler_L = V_Controler Then XIDUSD_Controler_L = V_Controler->V_Prev DeAllocate(V_Controler) Print "DEVICE REMOVED!" End Function '############################################################################################################################################################## Function XIDUSD_DevReadData(V_Controler as XIDUSD_Controler_Type Ptr, V_Data as String, V_DataLen as Integer) as Integer 'return -1 'If V_DataLen = 20 Then Print "BUTTONS:" & Bin(V_Data[2], 8) & " - " & Bin(V_Data[3], 8) Dim TInEVD(1 to 255) as input_event Dim TInEVC as Integer Dim TCode as Integer Dim TValue as Integer Dim TMPtr as XIDUSD_ControlerInputMask_Type Ptr = V_Controler->V_Masks_F Do Until TMPtr = 0 With *TMPtr For X as Integer = 0 to 255 If TInEVC >= 255 Then Exit For If X > V_DataLen Then Exit For If .V_Mask(X) > 0 Then If .V_Value(X) < 0 Then If .V_Value(X) = XIDUSD_CIMT_LenCheck Then If V_Data[X] <> V_DataLen Then Exit For Continue For End If If .V_Style = 1 Then If (V_Data[X] and .V_Mask(X)) <> 0 Then TValue = .V_Set(X) Else TValue = 0 Select Case .V_Value(X) Case XIDUSD_CIMT_GET_Button_XBOX : TCode = BTN_MODE Case XIDUSD_CIMT_GET_Button_START : TCode = BTN_START Case XIDUSD_CIMT_GET_Button_BACK : TCode = BTN_BACK Case XIDUSD_CIMT_GET_Button_FOR : TCode = BTN_FORWARD Case XIDUSD_CIMT_GET_Button_SELECT : TCode = BTN_SELECT Case XIDUSD_CIMT_GET_Button_X : TCode = BTN_X Case XIDUSD_CIMT_GET_Button_Y : TCode = BTN_Y Case XIDUSD_CIMT_GET_Button_A : TCode = BTN_A Case XIDUSD_CIMT_GET_Button_B : TCode = BTN_B Case XIDUSD_CIMT_GET_Button_A1 : TCode = BTN_C Case XIDUSD_CIMT_GET_Button_A2 : TCode = BTN_Z Case XIDUSD_CIMT_GET_Button_TL : TCode = BTN_TL Case XIDUSD_CIMT_GET_Button_TR : TCode = BTN_TR Case XIDUSD_CIMT_GET_Button_BL : TCode = BTN_TL2 Case XIDUSD_CIMT_GET_Button_BR : TCode = BTN_TR2 Case XIDUSD_CIMT_GET_Button_Up : TCode = BTN_TRIGGER_HAPPY3 Case XIDUSD_CIMT_GET_Button_Down : TCode = BTN_TRIGGER_HAPPY4 Case XIDUSD_CIMT_GET_Button_Left : TCode = BTN_TRIGGER_HAPPY1 Case XIDUSD_CIMT_GET_Button_Right : TCode = BTN_TRIGGER_HAPPY2 End Select TInEVC += 1 With TInEVD(TInEVC) .type = EV_KEY .code = TCode .value = TValue '*Cast(Short Ptr, @V_Data[6]) End With 'Print "EVD: >" & X & "<___>" & TCode & "<___>" & TValue & "<" Else Select Case .V_Value(X) Case XIDUSD_CIMT_GET_Axis_1 : TCode = ABS_X + 1 Case XIDUSD_CIMT_GET_Axis_2 : TCode = ABS_Y + 1 Case XIDUSD_CIMT_GET_Axis_3 : TCode = ABS_RX + 1 Case XIDUSD_CIMT_GET_Axis_4 : TCode = ABS_RY + 1 Case XIDUSD_CIMT_GET_Axis_5 : TCode = ABS_GAS + 1 Case XIDUSD_CIMT_GET_Axis_6 : TCode = ABS_BRAKE + 1 Case XIDUSD_CIMT_GET_Axis_7 : TCode = ABS_Z + 1 Case XIDUSD_CIMT_GET_Axis_8 : TCode = ABS_RZ + 1 End Select Select Case .V_Style Case 0 Select Case .V_Type(X) Case 0: TValue = CInt(*Cast(UByte Ptr, @V_Data[X])) Case 1: TValue = CInt(*Cast(Short Ptr, @V_Data[X])) Case 2: TValue = CInt(*Cast(Integer Ptr, @V_Data[X])) End Select If .V_Invers = 1 Then TValue = -TValue Case 2 If (V_Data[X] and .V_Mask(X)) <> 0 Then TValue = .V_Set(X) Else TValue = 0 For XX as Integer = 1 to TInEVC If TInEVD(XX).code = (TCode - 1) Then If TValue <> 0 Then TInEVD(XX).value = TValue TCode = 0 Exit For End If Next End Select If TCode <> 0 Then TInEVC += 1 With TInEVD(TInEVC) .type = EV_ABS .code = TCode - 1 .value = TValue End With End If 'Print "EVA: >" & X & "<___>" & TInEVC & "<___>" & TCode & "<___>" & TValue & "<" 'Print " >" & X & "<___>" & .V_Value(X) & "<___>" & .V_Type(X) & "<___>" & V_Data[X] & "<" End If Else: If V_Data[X] <> .V_Value(X) Then Exit For End If End If Next End With TMPtr = TMPtr->V_Next Loop 'Print "" If TInEVC <= 0 Then Return 1 'Print "WRITE:" & write_(V_Controler->V_UInput_FID, @TInEVD(1), TInEVC * SizeOf(input_event)) ' <> SizeOf(TUInputDev) Then XIDUSD_UInput_Term(V_Controler): Print "Failed write DeviceHeader!": Return -1 For X as integer = 1 to TInEVC write_(V_Controler->V_UInput_FID, @TInEVD(X), SizeOf(input_event)) next Return 1 End Function '############################################################################################################################################################## Sub Main() Print "2013 By.: ThePuppetMaster" Print "init..." Dim TCMDC as Integer Dim DD() as String Dim DC as Integer Dim T as String Do TCMDC += 1 T = Command(TCMDC) If T = "" Then Exit Do If Trim(T) = "" Then Continue Do DC += 1 Redim Preserve DD(DC) as String DD(DC) = Trim(T) Loop Print "read devlist..." XIDUSD_Controler_TypesC = 0 Dim TAttr as Integer T = Dir("controler/*", -1, @TAttr) Do Until T = "" If (T <> ".") and (T <> "..") Then If (LCase(Right(T, 4)) = ".xid") and ((TAttr and &H10) = 0) and (Len(T) = 12) Then XIDUSD_Controler_TypesC += 1 Redim Preserve XIDUSD_Controler_TypesD(XIDUSD_Controler_TypesC) as String XIDUSD_Controler_TypesD(XIDUSD_Controler_TypesC) = UCase(Left(T, 8)) Print "DEV:>" & XIDUSD_Controler_TypesD(XIDUSD_Controler_TypesC) & "<" End If End If T = Dir("", -1, @TAttr) Loop 'XIDUSD_UInput_Init() 'sleep 2000, 1 'XIDUSD_UInput_Term() 'end 0 Print "init usb..." usb_init() Print "ready!" Dim TBPtr as usb_bus Ptr Dim TDPtr as usb_device Ptr Dim TDPtrF as usb_device Ptr Dim TTotCheck as Double Dim X as UInteger Dim TBufferC as Integer = 256 Dim TBufferR as Integer Dim TBufferD as String = String(TBufferC, 0) Dim TCPtr as XIDUSD_Controler_Type Ptr Dim TCPtrN as XIDUSD_Controler_Type Ptr Dim TTXT as Double = Timer() + 1 Dim TBufferTX as String Do Until InKey() = Chr(27) If TTotCheck < Timer() Then usb_find_busses() usb_find_devices() TBPtr = usb_get_busses() Do Until TBPtr = 0 TDPtr = TBPtr->devices Do Until TDPtr = 0 With TDPtr->descriptor For X as UInteger = 1 to G_ControlerC T = UCase(Hex(.idVendor, 4)) & UCase(Hex(.idProduct, 4)) For X = 1 to XIDUSD_Controler_TypesC If XIDUSD_Controler_TypesD(X) = T Then If XIDUSD_DevCheckExist(TDPtr) = -1 Then XIDUSD_DevAdd(TDPtr) End If Next Next End With TDPtr = TDPtr->next Loop TBPtr = TBPtr->next Loop TTotCheck = Timer() + 3 End If 'If XIDUSD_Controler_F <> 0 Then 'TBufferR = usb_bulk_read(XIDUSD_Controler_F->V_DeviceFN, EP_IN, @TBufferD[0], TBufferC, 5000) 'Print TBufferR 'End If TCPtr = XIDUSD_Controler_F Do Until TCPtr = 0 TBufferR = usb_bulk_read(TCPtr->V_DeviceFN, TCPtr->V_EP_AdrR, @TBufferD[0], TBufferC, 5000) If TBufferR = 0 Then TCPtr = TCPtr->V_Next: Continue Do If TBufferR < 0 Then Print "-1!!!" With *TCPtr usb_release_interface(.V_DeviceFN, 0) usb_close(.V_DeviceFN) .V_MarkDel = 1 End With Else 'If TTXT < Timer() Then 'TBufferTX = Chr(&H03, &H08, &H00, &H07, &H00, &H08, &H00, &H00) 'TBufferTX = Chr(&H00, &H08, &H00, &H01, &H02, &H00, &H00, &H00) 'Print usb_bulk_write(TCPtr->V_DeviceFN, TCPtr->V_EP_AdrW, @TBufferTX[0], Len(TBufferTX), 5000) '/* set the led mode (0x06 = 1 on) */ 'TBufferTX = Chr(&H01, &H03, &H06) 'Print usb_bulk_write(TCPtr->V_DeviceFN, TCPtr->V_EP_AdrW, @TBufferTX[0], Len(TBufferTX), 5000) 'TBufferTX = Chr(&H03, &H03, &H00) 'Print usb_bulk_write(TCPtr->V_DeviceFN, EP_OUT, @TBufferTX[0], Len(TBufferTX), 5000) 'TBufferTX = Chr(&H00, &H08, &H00) 'Print usb_bulk_write(TCPtr->V_DeviceFN, EP_OUT, @TBufferTX[0], Len(TBufferTX), 5000) 'TBufferTX = Chr(&H00, &H00, &H08, &H41, &H00, &H00, &H00, &H00, &H00, &H00, &H00, &H00) 'Print usb_bulk_write(TCPtr->V_DeviceFN, EP_OUT, @TBufferTX[0], Len(TBufferTX), 5000) 'TBufferTX = Chr(&H00, &H01, &H0F, &HC0, &H00, &H00, &H00, &H00, &H00, &H00, &H00, &H00) 'Print usb_bulk_write(TCPtr->V_DeviceFN, EP_OUT, @TBufferTX[0], Len(TBufferTX), 5000) 'TTXT = Timer() + 1000 'End If XIDUSD_DevReadData(TCPtr, TBufferD, TBufferR) End If TCPtr = TCPtr->V_Next Loop TCPtr = XIDUSD_Controler_F Do Until TCPtr = 0 TCPtrN = TCPtr->V_Next If TCPtr->V_MarkDel = 1 Then XIDUSD_DevDel(TCPtr) TCPtr = TCPtrN Loop Sleep 10, 1 Loop 'Print "usb_close:"; usb_close(TDevFN) 'XIDUSD_UInput_Init() 'sleep 2000, 1 'XIDUSD_UInput_Term() 'end 0 End Sub '############################################################################################################################################################## Main() end 0