home *** CD-ROM | disk | FTP | other *** search
- VERSION 5.00
- Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
- Begin VB.Form frmForceFeedback
- BorderStyle = 3 'Fixed Dialog
- Caption = "VB Force Feedback"
- ClientHeight = 7020
- ClientLeft = 45
- ClientTop = 330
- ClientWidth = 9315
- Icon = "ForceFeedback.frx":0000
- LinkTopic = "Form1"
- MaxButton = 0 'False
- MinButton = 0 'False
- ScaleHeight = 7020
- ScaleWidth = 9315
- StartUpPosition = 2 'CenterScreen
- Begin VB.Frame frameDirection
- Caption = "Direction"
- Height = 2895
- Left = 6720
- TabIndex = 70
- Top = 3960
- Width = 2415
- Begin VB.OptionButton optDirection
- Caption = "Option1"
- Height = 210
- Index = 0
- Left = 1080
- TabIndex = 78
- Top = 480
- Value = -1 'True
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option2"
- Height = 210
- Index = 4
- Left = 1080
- TabIndex = 77
- Top = 2280
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option3"
- Height = 210
- Index = 6
- Left = 240
- TabIndex = 76
- Top = 1380
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option4"
- Height = 210
- Index = 2
- Left = 1920
- TabIndex = 75
- Top = 1320
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option5"
- Height = 210
- Index = 7
- Left = 480
- TabIndex = 74
- Top = 840
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option6"
- Height = 210
- Index = 1
- Left = 1680
- TabIndex = 73
- Top = 840
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option7"
- Height = 210
- Index = 5
- Left = 480
- TabIndex = 72
- Top = 1920
- Width = 200
- End
- Begin VB.OptionButton optDirection
- Caption = "Option8"
- Height = 210
- Index = 3
- Left = 1680
- TabIndex = 71
- Top = 1920
- Width = 200
- End
- End
- Begin VB.Frame frameEnvelope
- Caption = "Envelope"
- Height = 2895
- Left = 3720
- TabIndex = 56
- Top = 3960
- Width = 2775
- Begin MSComctlLib.Slider sldEnvelope
- Height = 255
- Index = 0
- Left = 240
- TabIndex = 58
- Top = 855
- Width = 2295
- _ExtentX = 4048
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin VB.CheckBox chkEnvelope
- Caption = "Use envelope"
- Height = 255
- Left = 720
- TabIndex = 57
- Top = 280
- Width = 1335
- End
- Begin MSComctlLib.Slider sldEnvelope
- Height = 255
- Index = 1
- Left = 240
- TabIndex = 59
- Top = 1380
- Width = 2295
- _ExtentX = 4048
- _ExtentY = 450
- _Version = 393216
- LargeChange = 10000
- SmallChange = 1000
- Max = 5000000
- TickFrequency = 500000
- End
- Begin MSComctlLib.Slider sldEnvelope
- Height = 255
- Index = 2
- Left = 240
- TabIndex = 60
- Top = 1965
- Width = 2295
- _ExtentX = 4048
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin MSComctlLib.Slider sldEnvelope
- Height = 255
- Index = 3
- Left = 240
- TabIndex = 61
- Top = 2520
- Width = 2295
- _ExtentX = 4048
- _ExtentY = 450
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Max = 5000000
- TickFrequency = 500000
- End
- Begin VB.Label lblEnvelope
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 3
- Left = 1440
- TabIndex = 69
- Top = 2325
- Width = 90
- End
- Begin VB.Label lblEnvelope
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Index = 2
- Left = 1440
- TabIndex = 68
- Top = 1740
- Width = 450
- End
- Begin VB.Label lblEnvelope
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 1
- Left = 1440
- TabIndex = 67
- Top = 1170
- Width = 90
- End
- Begin VB.Label lblEnvelope
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Index = 0
- Left = 1440
- TabIndex = 66
- Top = 600
- Width = 450
- End
- Begin VB.Label Label20
- AutoSize = -1 'True
- Caption = "Fade Time:"
- Height = 195
- Left = 510
- TabIndex = 65
- Top = 2325
- Width = 795
- End
- Begin VB.Label Label19
- AutoSize = -1 'True
- Caption = "Fade Level:"
- Height = 195
- Left = 465
- TabIndex = 64
- Top = 1740
- Width = 840
- End
- Begin VB.Label Label18
- AutoSize = -1 'True
- Caption = "Attack Time:"
- Height = 195
- Left = 405
- TabIndex = 63
- Top = 1170
- Width = 900
- End
- Begin VB.Label Label17
- AutoSize = -1 'True
- Caption = "Attack Level:"
- Height = 195
- Left = 360
- TabIndex = 62
- Top = 600
- Width = 945
- End
- End
- Begin VB.Frame frameTypeContainer
- Caption = "Type-Specific Parameters"
- Height = 3495
- Left = 3720
- TabIndex = 12
- Top = 240
- Width = 5415
- Begin VB.Frame frameCondition
- Caption = "Conditional Force"
- Height = 3015
- Left = 120
- TabIndex = 37
- Top = 240
- Visible = 0 'False
- Width = 5175
- Begin VB.OptionButton optConditionAxis
- Caption = "Y Axis"
- Height = 255
- Index = 1
- Left = 2280
- TabIndex = 80
- Top = 2700
- Width = 735
- End
- Begin VB.OptionButton optConditionAxis
- Caption = "X Axis"
- Height = 255
- Index = 0
- Left = 2280
- TabIndex = 79
- Top = 2440
- Value = -1 'True
- Width = 735
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 0
- Left = 240
- TabIndex = 38
- Top = 600
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 1
- Left = 240
- TabIndex = 39
- Top = 1320
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 2
- Left = 240
- TabIndex = 40
- Top = 2160
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 3
- Left = 2880
- TabIndex = 41
- Top = 600
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 4
- Left = 2880
- TabIndex = 42
- Top = 1320
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldCondition
- Height = 255
- Index = 5
- Left = 2880
- TabIndex = 43
- Top = 2160
- Width = 2055
- _ExtentX = 3625
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin VB.Label Label11
- AutoSize = -1 'True
- Caption = "Dead band:"
- Height = 195
- Left = 240
- TabIndex = 55
- Top = 360
- Width = 840
- End
- Begin VB.Label Label12
- AutoSize = -1 'True
- Caption = "Negative Coefficient:"
- Height = 195
- Left = 240
- TabIndex = 54
- Top = 1080
- Width = 1455
- End
- Begin VB.Label Label13
- AutoSize = -1 'True
- Caption = "Negative Saturation:"
- Height = 195
- Left = 240
- TabIndex = 53
- Top = 1920
- Width = 1455
- End
- Begin VB.Label Label14
- AutoSize = -1 'True
- Caption = "Offset:"
- Height = 195
- Left = 3120
- TabIndex = 52
- Top = 360
- Width = 465
- End
- Begin VB.Label Label15
- AutoSize = -1 'True
- Caption = "Positive Coefficient:"
- Height = 195
- Left = 3000
- TabIndex = 51
- Top = 1080
- Width = 1365
- End
- Begin VB.Label Label16
- AutoSize = -1 'True
- Caption = "Positive Saturation:"
- Height = 195
- Left = 3000
- TabIndex = 50
- Top = 1920
- Width = 1365
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 0
- Left = 1200
- TabIndex = 49
- Top = 360
- Width = 90
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 1
- Left = 1800
- TabIndex = 48
- Top = 1080
- Width = 90
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Index = 2
- Left = 1800
- TabIndex = 47
- Top = 1920
- Width = 450
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 3
- Left = 3600
- TabIndex = 46
- Top = 360
- Width = 90
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 4
- Left = 4440
- TabIndex = 45
- Top = 1080
- Width = 90
- End
- Begin VB.Label lblCondition
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Index = 5
- Left = 4410
- TabIndex = 44
- Top = 1920
- Width = 450
- End
- End
- Begin VB.Frame framePeriodic
- Caption = "Periodic Force"
- Height = 3015
- Left = 120
- TabIndex = 24
- Top = 240
- Visible = 0 'False
- Width = 5175
- Begin MSComctlLib.Slider sldPeriodic
- Height = 255
- Index = 0
- Left = 600
- TabIndex = 25
- Top = 480
- Width = 4095
- _ExtentX = 7223
- _ExtentY = 450
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldPeriodic
- Height = 255
- Index = 1
- Left = 600
- TabIndex = 26
- Top = 1080
- Width = 4095
- _ExtentX = 7223
- _ExtentY = 450
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldPeriodic
- Height = 255
- Index = 2
- Left = 600
- TabIndex = 27
- Top = 1800
- Width = 4095
- _ExtentX = 7223
- _ExtentY = 450
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Max = 35999
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldPeriodic
- Height = 255
- Index = 3
- Left = 600
- TabIndex = 28
- Top = 2520
- Width = 4095
- _ExtentX = 7223
- _ExtentY = 450
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Max = 500000
- TickFrequency = 10000
- End
- Begin VB.Label lblPeriodic
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 3
- Left = 2400
- TabIndex = 36
- Top = 2280
- Width = 90
- End
- Begin VB.Label Label10
- AutoSize = -1 'True
- Caption = "Period:"
- Height = 195
- Left = 1800
- TabIndex = 35
- Top = 2280
- Width = 495
- End
- Begin VB.Label lblPeriodic
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 2
- Left = 2400
- TabIndex = 34
- Top = 1560
- Width = 90
- End
- Begin VB.Label Label9
- AutoSize = -1 'True
- Caption = "Phase:"
- Height = 195
- Left = 1800
- TabIndex = 33
- Top = 1560
- Width = 495
- End
- Begin VB.Label lblPeriodic
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 1
- Left = 2400
- TabIndex = 32
- Top = 840
- Width = 90
- End
- Begin VB.Label Label8
- AutoSize = -1 'True
- Caption = "Offset:"
- Height = 195
- Left = 1800
- TabIndex = 31
- Top = 840
- Width = 465
- End
- Begin VB.Label lblPeriodic
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 0
- Left = 2400
- TabIndex = 30
- Top = 240
- Width = 90
- End
- Begin VB.Label Label7
- AutoSize = -1 'True
- Caption = "Magnitude:"
- Height = 195
- Left = 1560
- TabIndex = 29
- Top = 240
- Width = 795
- End
- End
- Begin VB.Frame frameRampForce
- Caption = "Ramp Force"
- Height = 3015
- Left = 120
- TabIndex = 17
- Top = 240
- Width = 5175
- Begin MSComctlLib.Slider sldRampRange
- Height = 495
- Index = 0
- Left = 480
- TabIndex = 18
- Top = 840
- Width = 4215
- _ExtentX = 7435
- _ExtentY = 873
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin MSComctlLib.Slider sldRampRange
- Height = 495
- Index = 1
- Left = 480
- TabIndex = 19
- Top = 1920
- Width = 4215
- _ExtentX = 7435
- _ExtentY = 873
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Min = -10000
- Max = 10000
- TickFrequency = 1000
- End
- Begin VB.Label lblRange
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 1
- Left = 2400
- TabIndex = 23
- Top = 1680
- Width = 90
- End
- Begin VB.Label Label2
- AutoSize = -1 'True
- Caption = "Range End:"
- Height = 195
- Left = 1440
- TabIndex = 22
- Top = 1680
- Width = 855
- End
- Begin VB.Label lblRange
- AutoSize = -1 'True
- Caption = "0"
- Height = 195
- Index = 0
- Left = 2400
- TabIndex = 21
- Top = 600
- Width = 90
- End
- Begin VB.Label Label1
- AutoSize = -1 'True
- Caption = "Range Start:"
- Height = 195
- Left = 1440
- TabIndex = 20
- Top = 600
- Width = 900
- End
- End
- Begin VB.Frame frameConstantForce
- Caption = "Constant Force"
- Height = 3015
- Left = 120
- TabIndex = 13
- Top = 240
- Visible = 0 'False
- Width = 5175
- Begin MSComctlLib.Slider sldConstantForce
- Height = 495
- Left = 840
- TabIndex = 14
- Top = 1320
- Width = 3615
- _ExtentX = 6376
- _ExtentY = 873
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin VB.Label lblConstantForce
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Left = 3360
- TabIndex = 16
- Top = 1080
- Width = 450
- End
- Begin VB.Label Label5
- AutoSize = -1 'True
- Caption = "Constant Force Magnitude:"
- Height = 195
- Left = 1320
- TabIndex = 15
- Top = 1080
- Width = 1920
- End
- End
- End
- Begin VB.Frame frmGeneral
- Caption = "General Parameters"
- Height = 2895
- Left = 120
- TabIndex = 1
- Top = 3960
- Width = 3375
- Begin MSComctlLib.Slider sldDuration
- Height = 495
- Left = 240
- TabIndex = 2
- Top = 600
- Width = 2775
- _ExtentX = 4895
- _ExtentY = 873
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Min = 1
- Max = 50001
- SelStart = 50001
- TickFrequency = 5000
- Value = 50001
- End
- Begin MSComctlLib.Slider sldGain
- Height = 495
- Left = 240
- TabIndex = 5
- Top = 1320
- Width = 2775
- _ExtentX = 4895
- _ExtentY = 873
- _Version = 393216
- LargeChange = 100
- SmallChange = 10
- Max = 10000
- SelStart = 10000
- TickFrequency = 1000
- Value = 10000
- End
- Begin MSComctlLib.Slider sldSamplePeriod
- Height = 495
- Left = 240
- TabIndex = 9
- Top = 2160
- Width = 2775
- _ExtentX = 4895
- _ExtentY = 873
- _Version = 393216
- LargeChange = 1000
- SmallChange = 100
- Max = 100000
- TickFrequency = 10000
- End
- Begin VB.Label lblSamplePeriod
- AutoSize = -1 'True
- Caption = "Default"
- Height = 195
- Left = 1320
- TabIndex = 11
- Top = 1920
- Width = 510
- End
- Begin VB.Label Label6
- AutoSize = -1 'True
- Caption = "Sample rate:"
- Height = 195
- Left = 360
- TabIndex = 10
- Top = 1920
- Width = 885
- End
- Begin VB.Label lblGain
- AutoSize = -1 'True
- Caption = "10000"
- Height = 195
- Left = 1200
- TabIndex = 7
- Top = 1080
- Width = 450
- End
- Begin VB.Label Label4
- AutoSize = -1 'True
- Caption = "Effect gain:"
- Height = 195
- Left = 360
- TabIndex = 6
- Top = 1080
- Width = 810
- End
- Begin VB.Label lblDuration
- AutoSize = -1 'True
- Caption = "Infinite"
- Height = 195
- Left = 1560
- TabIndex = 4
- Top = 360
- Width = 465
- End
- Begin VB.Label Label3
- AutoSize = -1 'True
- Caption = "Effect Duration:"
- Height = 195
- Left = 360
- TabIndex = 3
- Top = 360
- Width = 1110
- End
- End
- Begin VB.ListBox lstEffects
- Height = 3375
- Left = 120
- TabIndex = 0
- Top = 360
- Width = 3375
- End
- Begin VB.Label lblAvailable
- AutoSize = -1 'True
- Caption = "Available effects:"
- Height = 195
- Left = 120
- TabIndex = 8
- Top = 120
- Width = 1215
- End
- Attribute VB_Name = "frmForceFeedback"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- ' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
- ' File: ForceFeedback.frm
- ' Content: Demonstrates the use of force feedback using
- ' stock dinput effects
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- Option Explicit
- Dim dx As New DirectX8 'DirectX 8 object
- Dim di As DirectInput8 'DirectInput object
- Dim diJoystick As DirectInputDevice8 'DirectInput device object
- Dim enumDevice As DirectInputEnumDevices8 'DirectInput enumeration for devices object
- Dim diEnumObjects As DirectInputEnumDeviceObjects 'DirectInput enumeration for objects on a device object
- Dim diDevObjInstance As DirectInputDeviceObjectInstance 'DirectInput object on a device object
- Dim diEffEnum As DirectInputEnumEffects 'DirectInput enumeration for force feedback effects object
- Dim diFFEffect() As DirectInputEffect 'Force feedback effects object
- Dim diEffectType As Long 'Will be used to store the type of effect an effect object is
- Dim diFFStaticParams As Long 'Will be used to store the static parameters of an effect object
- Dim EffectParams() As Long 'Used to store the type of effect it is
- Dim Caps As DIDEVCAPS 'Will be used to store the capabilities of the diJoystick
- Dim lngLastEffectIndex As Long 'Will be used to store the last effect
- Dim bInit As Boolean
- Private Function CreateFFEffect(Index As Integer) As DIEFFECT
- 'This sub creates a generic effect DIEFFECT structure to be used in creating the effect
- With CreateFFEffect
- .lDuration = &HFFFFFFFF 'Infinite duration
- .lGain = 10000 'Full gain
- .lSamplePeriod = 1000 'Default sample period
- .lTriggerButton = DIEB_NOTRIGGER 'Do Not require a trigger for the effects
- .lTriggerRepeatInterval = -1 'Turn off trigger repeat interval
-
- .constantForce.lMagnitude = 10000 'Make the magnitude of a constant force effect at full
- .rampForce.lRangeStart = 0 'Make the magnitude at the start of a ramp force 0
- .rampForce.lRangeEnd = 0 'Make the magnitude at the end of a ramp force 0
- .conditionFlags = DICONDITION_USE_BOTH_AXES 'Use both axis when using a conditional force
- With .conditionX 'For the X axis
- .lDeadBand = 0 'Make an effect with no deadband
- .lNegativeSaturation = 10000 'Turn the negative saturation all the way up
- .lOffset = 0 'Zero the offset
- .lPositiveSaturation = 10000 'Turn the positive saturation all the way up
- End With
- With .conditionY 'For the Y axis
- .lDeadBand = 0 'Make an effect with no deadband
- .lNegativeSaturation = 10000 'Turn the negative saturation all the way up
- .lOffset = 0 'Zero the offset
- .lPositiveSaturation = 10000 'Turn the positive saturation all the way up
- End With
- With .periodicForce 'For a periodic force
- .lMagnitude = 10000 'Turn the magnitude of the force all the way up
- .lOffset = 0 'Zero the offset
- .lPeriod = 0 'Set the length of a cycle to 0. This tells the driver to use the default.
- .lPhase = 0 'Zero the starting phase. Phase is something that has very
- 'limited support, so changing this parameter will almost always
- 'fail. Be prepared to catch the error this will return.
- End With
- End With
- End Function
- Private Sub chkEnvelope_Click()
- Call ChangeParameter("envelope") 'Call the sub to change the parameters for the envelope of the effect.
-
- End Sub
- Private Sub Form_Activate()
- Dim i As Long 'Count variable
- Dim j As Integer 'Count variable
- Dim prop As DIPROPLONG 'Device property structure
- Dim diedo As DirectInputEnumDeviceObjects 'Holds the collection of individual objects on a device
- Dim didoi As DirectInputDeviceObjectInstance 'Holds the instance of an object on a device
- Dim lFFAxisCount As Long 'Holds the number of axis that support FF
- Set di = dx.DirectInputCreate 'Create the direct input device
- Set enumDevice = di.GetDIDevices(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY Or DIEDFL_FORCEFEEDBACK)
- 'Enumerate all joysticks that are attached to the system
- For i = 1 To enumDevice.GetCount
-
- Set diJoystick = di.CreateDevice(enumDevice.GetItem(i).GetGuidInstance)
- diJoystick.GetCapabilities Caps 'Get the capabilites of the device
- Set diedo = diJoystick.GetDeviceObjectsEnum(DIDFT_AXIS) ' Get info about all the axis on the device
-
- 'This loops through to make sure that there
- 'are at least two axis that support FF
- For j = 1 To diedo.GetCount
- Set didoi = diedo.GetItem(j)
- If (didoi.GetFlags And DIDOI_FFACTUATOR) Then
- lFFAxisCount = lFFAxisCount + 1
- End If
- Next
-
- If lFFAxisCount > 1 Then
-
- diJoystick.SetCommonDataFormat DIFORMAT_JOYSTICK 'Set the format of the device to that of a joystick
- diJoystick.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_EXCLUSIVE
- 'Set the cooperative level of the device as an exclusive
- 'background device, and attach it to the form's hwnd
- prop.lData = 0
- prop.lHow = DIPH_DEVICE
- prop.lObj = 0
- Call diJoystick.SetProperty("DIPROP_AUTOCENTER", prop) 'Turn off autocenter
-
- diJoystick.Acquire 'Make sure to aquire the device
- Set diEffEnum = diJoystick.GetEffectsEnum(DIEFT_ALL)
- 'Enumerate all the available effects
- For j = 1 To diEffEnum.GetCount 'Loop through all the effects
- diEffectType = diEffEnum.GetType(j) And &HFF
- 'Filter out the major type of effect it is
- diFFStaticParams = diEffEnum.GetStaticParams(j)
- 'Get the static parameters of this effect
- If (diEffectType = DIEFT_HARDWARE) And _
- (diFFStaticParams And DIEP_TYPESPECIFICPARAMS) <> 0 Then
- 'If this is a hardware effect that has type-specific parameters,
- GoTo Ignore 'ignore it and skip to the next effect
- ElseIf diEffectType = DIEFT_CUSTOMFORCE Then
- 'If this effect is a custom effect,
- GoTo Ignore 'ignore it and skip to the next effect
- End If
- lstEffects.AddItem diEffEnum.GetName(j)
- 'Add this effect to the listbox, displaying the name of the
- 'effect
- ReDim Preserve EffectParams(lstEffects.ListCount - 1)
- 'Redimension the array that stores the type of effect this
- 'effect is
- EffectParams(lstEffects.ListCount - 1) = diEffectType
- 'store the type of effect in the EffectParams array
- ReDim Preserve diFFEffect(lstEffects.ListCount - 1)
- 'Redimension the effect object array
-
- On Local Error GoTo ErrorHandler 'Catch any errors when creating the effect object
- Set diFFEffect(UBound(diFFEffect)) = diJoystick.CreateEffect(diEffEnum.GetEffectGuid(j), _
- CreateFFEffect(j)) 'Create the effect, using the return value from the
- 'CreateFFEffect function, which returns a generic effect
- 'structure
- diFFEffect(UBound(diFFEffect)).Unload 'Since creating an effect automtically downloads it, unload
- 'it so we don't run out of room on the device.
- Ignore:
- Next
- Exit For 'Keep the first FF joystick found
- Else
- Set diJoystick = Nothing 'Destroy this device and try again if there are more devices
- End If
- Next
- If diJoystick Is Nothing Then 'If no FF joystick is found attached to the system
- MsgBox "No force feedback joystick attached, app will exit" 'Display this message
- Unload Me 'Unload the form
- End 'End the program
- End If
- If diFFEffect(0) Is Nothing Then 'If this device has no downloadable effects, end the app
- MsgBox "This device does not contain any downloadable effects, app will exit"
- Unload Me 'Unload the form
- End 'End the program
- End If
- lngLastEffectIndex = UBound(diFFEffect) 'Store the ubound of the effect array as the last effect accessed
- bInit = True
- lstEffects.ListIndex = 0 'make the first index of the listbox selected
-
- Exit Sub 'Exit the sub
- ErrorHandler: 'Handle any errors that occur when trying to create an effect object
- If Err.Number = 5 Then 'If this is an effect that isn't able to be loaded
- If lstEffects.ListCount > 0 Then
- lstEffects.RemoveItem lstEffects.ListCount - 1 'Remove the item from the list
- If (lstEffects.ListCount > 0) Then
- ReDim Preserve diFFEffect(lstEffects.ListCount - 1) 'Redimension the array since this effect will not be included
- ReDim Preserve EffectParams(lstEffects.ListCount - 1) 'Redimension the effect params array as well
- Else
- Erase diFFEffect
- Erase EffectParams
- End If
- End If
- Err.Clear
- GoTo Ignore 'Skip this effect
-
- ElseIf Err.Number = DIERR_NOTEXCLUSIVEACQUIRED Then 'If the program loses exclusive use of the joystick,
- diJoystick.Unacquire 'Unacquire the joystick
- diJoystick.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_EXCLUSIVE
- 'Set the cooperative level again
- diJoystick.Acquire 'Acquire the joystick again
- Resume 'Resume execution on that line again, since the program
- 'now has control of the joystick
- End If
- End Sub
- Private Sub lstEffects_Click()
- If bInit = False Then Exit Sub
- 'This sub unloads the last effect, downloads the new one, stores the index in the last effect variable, and
- 'calls the sub to update all the frames and controls on the form
- Dim EffectInfo As DIEFFECT 'Dim a DIEFFECT structure
- On Local Error GoTo ErrorHandler 'Catch any errors while unloading/downloading effects
- diFFEffect(lngLastEffectIndex).Unload 'Unload the last effect
- diFFEffect(lstEffects.ListIndex).Start 1, 0 'Start the effect playing (this will also download the effect)
- lngLastEffectIndex = lstEffects.ListIndex 'Store this list index in the lasteffectindex variable
- Call UpdateFrames 'Call the sub that updates all the frames and the controls
- 'they contain on the form
- Exit Sub
- ErrorHandler: 'Handle any errors
- If Err.Number = DIERR_NOTEXCLUSIVEACQUIRED Then 'If the program loses exclusive use of the joystick,
- diJoystick.Unacquire 'Unacquire the joystick
- diJoystick.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_EXCLUSIVE
- 'Set the cooperative level again
- diJoystick.Acquire 'Acquire the joystick again
- Resume 'Resume execution on that line again, since the program
- 'now has control of the joystick
- End If
- End Sub
- Private Sub ChangeParameter(Param As String)
- On Local Error GoTo ErrorHandler
- 'This sub changes the specified parameter
- If lstEffects.ListIndex = -1 Then Exit Sub
- Dim EffectInfo As DIEFFECT 'Dim a DIEFFECT structure
- diFFEffect(lstEffects.ListIndex).GetParameters EffectInfo
- 'Get the parameters of this effect
- On Local Error GoTo ErrorHandler 'If there are any errors that occur, trap them
-
- Select Case Param 'Select the string value passed to the sub
- Case "duration" 'If duration is being changed
- If sldDuration = 50001 Then 'If the slider's value is at 50,001
- EffectInfo.lDuration = -1 'Then make the effect have an infinite duration
- Else 'Otherwise
- EffectInfo.lDuration = sldDuration * 100
- 'Multiply the slider's value by 100 to convert to microseconds
- End If
- diFFEffect(lstEffects.ListIndex).Stop
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_DURATION
- 'Set the new parameter, specifiying the duration is what needs
- 'to be changed
- diFFEffect(lstEffects.ListIndex).Start 1, 0
- Case "gain" 'If gain is the parameter to be changed,
- EffectInfo.lGain = sldGain 'Set the effect info element lGain to the value of the gain slider
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_GAIN
- 'Set the new gain
- Case "samplerate" 'The sample rate is the parameter to be changed
- EffectInfo.lSamplePeriod = sldSamplePeriod 'Set the effectinfo lSamplePeriod to the value of the sample period slider
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_SAMPLEPERIOD
- 'Set the parameter
- Case "constantforcemagnitude" 'If the constant force magnitude is to be changed
- EffectInfo.constantForce.lMagnitude = sldConstantForce
- 'Set the constant force element to the value of the constant
- 'force slider
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_TYPESPECIFICPARAMS
- 'Change the parameter
- Case "rampforce" 'If ramp force is the parameter to change
- EffectInfo.rampForce.lRangeStart = sldRampRange(0).Value
- 'Set the start range to the range slider(0) value
- EffectInfo.rampForce.lRangeEnd = sldRampRange(1).Value
- 'Set the end range to the range slider(1) value
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_TYPESPECIFICPARAMS
- 'Set the parameters
- Case "periodic" 'If a periodic effect parameter needs to be changed
- With EffectInfo.periodicForce
- .lMagnitude = sldPeriodic(0) 'set the magnitude
- .lOffset = sldPeriodic(1) 'the offset
- .lPhase = sldPeriodic(2) 'the phase (this is almost always going to fail, there aren't
- 'a lot of drivers that will support this)
- .lPeriod = sldPeriodic(3) 'the period of the effect
- End With
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_TYPESPECIFICPARAMS
- 'set the parameters
- Case "condition" 'If it is a conditional effect parameter
- If optConditionAxis(0) Then 'If the X axis is selected
- With EffectInfo.conditionX 'Update the X axis condition information
- .lDeadBand = sldCondition(0) 'set the deadband
- .lNegativeCoefficient = sldCondition(1)
- 'set the negative coefficient
- .lNegativeSaturation = sldCondition(2)
- 'set the negative saturation
- .lOffset = sldCondition(3) 'set the offset
- .lPositiveCoefficient = sldCondition(4)
- 'set the positive coefficient
- .lPositiveSaturation = sldCondition(5)
- 'set the positive saturation
- End With
- Else 'Otherwise, the Y axis is being set
- With EffectInfo.conditionY
- .lDeadBand = sldCondition(0) 'set the deadband
- .lNegativeCoefficient = sldCondition(1)
- 'set the negative coefficient
- .lNegativeSaturation = sldCondition(2)
- 'set the negative saturation
- .lOffset = sldCondition(3) 'set the offset
- .lPositiveCoefficient = sldCondition(4)
- 'set the positive coefficient
- .lPositiveSaturation = sldCondition(5)
- 'set the positive saturation
- End With
- End If
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_TYPESPECIFICPARAMS
- 'set the parameters
- Case "envelope" 'the envelope needs to be changed
- If chkEnvelope.Value = 1 Then 'if the envelope checkbox is checked
- With EffectInfo
- .bUseEnvelope = True 'let DirectInput know this effect has an envelope
- With .envelope
- .lAttackLevel = sldEnvelope(0) 'set the attack level
- .lAttackTime = sldEnvelope(1) 'set the attack time
- .lFadeLevel = sldEnvelope(2) 'set the fade level
- .lFadeTime = sldEnvelope(3) 'set the fade time
- End With
- End With
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_ENVELOPE
- 'Set the new parameters
- Else
- EffectInfo.bUseEnvelope = False 'Otherwise, let DirectInput know that this effect doesn't use an envelope
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_ENVELOPE
- 'Set the parameters to reflect this change
- End If
- Case "direction" 'Direction is the parameter that needs to be changed
- With EffectInfo
- If optDirection(0) Then 'If the north button is selected
- .x = 0 'set the effect's direction to come from the north
- ElseIf optDirection(1) Then 'If the north-east button is selected
- .x = 4500 'set the effect's direction to come from the north-east
- ElseIf optDirection(2) Then 'if the east button is selected
- .x = 9000 'set the effect's direction to come from the east
- ElseIf optDirection(3) Then 'if the south-east button is selected
- .x = 13500 'set the effect's direction to come from the south east
- ElseIf optDirection(4) Then 'if the south button is selected
- .x = 18000 'set the effect's direction to come from the south
- ElseIf optDirection(5) Then 'if the south-west button is selected
- .x = 22500 'set the effect's direction to come from the south-west
- ElseIf optDirection(6) Then 'if the west button is selected
- .x = 27000 'set the effect's direction to come from the west
- ElseIf optDirection(7) Then 'if the north-west button is selected
- .x = 31500 'set the effects's direction to come from the north-west
- End If
- End With
- diFFEffect(lstEffects.ListIndex).SetParameters EffectInfo, DIEP_DIRECTION
- 'set the parameters
- End Select
-
- Exit Sub
- ErrorHandler: 'if an error is encountered while setting a parameter
- If Err.Number = 445 Then 'If the object doesn't support this action then
- MsgBox "The parameter cannot be set to this value for this effect type"
- 'display this message
- ElseIf Err.Number = DIERR_NOTEXCLUSIVEACQUIRED Then 'If the program loses exclusive use of the joystick,
- diJoystick.Unacquire 'Unacquire the joystick
- diJoystick.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_EXCLUSIVE
- 'Set the cooperative level again
- diJoystick.Acquire 'Acquire the joystick again
- Resume 'Resume execution on that line again, since the program
- 'now has control of the joystick
- End If
- End Sub
- Private Sub UpdateFrames()
- 'This sub updates all the frames and controls the frame contains on the form, with the values in the
- 'currently selected effect
- Dim EffType As DIEFFECT 'dim a DIEFFECT structure
-
- frameConstantForce.Visible = False '
- frameRampForce.Visible = False 'Hide all type-specific frames
- framePeriodic.Visible = False '
- frameCondition.Visible = False '
- diFFEffect(lstEffects.ListIndex).GetParameters EffType
- 'get the parameters of the effect
- optDirection(EffType.x \ 4500).Value = True 'make sure the correct direction is displayed
- If EffType.bUseEnvelope = True Then 'if this effect is using an envelope
- chkEnvelope.Value = 1 'make sure the envelope checkbox is checked
- sldEnvelope(0).Value = EffType.envelope.lAttackLevel
- 'display the attack level
- sldEnvelope(1).Value = EffType.envelope.lAttackTime
- 'display the attack time
- sldEnvelope(2).Value = EffType.envelope.lFadeLevel
- 'display the fade level
- sldEnvelope(3).Value = EffType.envelope.lFadeTime
- 'display the fade time
- Else 'otherwise
- chkEnvelope.Value = 0 '
- sldEnvelope(0).Value = 0 'Zero everything out
- sldEnvelope(1).Value = 0 '
- sldEnvelope(2).Value = 0 '
- sldEnvelope(3).Value = 0 '
- End If
- If EffType.lDuration = -1 Then 'If the effect duration is infinite
- sldDuration = 50001 'make sure the slider reflects this
- Else 'otherwise
- sldDuration = EffType.lDuration \ 100 'set the slider to the milliseconds
- End If
- sldGain = EffType.lGain 'display the gain
- sldSamplePeriod = EffType.lSamplePeriod 'display the sample period
- sldConstantForce = EffType.constantForce.lMagnitude 'display the constant force magnitude
- sldRampRange(0) = EffType.rampForce.lRangeStart 'display the range start of the ramp force
- sldRampRange(1) = EffType.rampForce.lRangeEnd 'display the range end of the ramp force
- sldPeriodic(0) = EffType.periodicForce.lMagnitude 'display the magnitude of the periodic force
- sldPeriodic(1) = EffType.periodicForce.lOffset 'display the offset of the periodic force
- sldPeriodic(2) = EffType.periodicForce.lPhase 'display the phase of the periodic force
- sldPeriodic(3) = EffType.periodicForce.lPeriod 'display the period of the periodic force
- If optConditionAxis(0) Then 'if the X axis option button is selected
- sldCondition(0) = EffType.conditionX.lDeadBand 'display the deadband value
- sldCondition(1) = EffType.conditionX.lNegativeCoefficient
- 'display the neg. coefficient
- sldCondition(2) = EffType.conditionX.lNegativeSaturation
- 'display the neg. saturation
- sldCondition(3) = EffType.conditionX.lOffset 'display the offset
- sldCondition(4) = EffType.conditionX.lPositiveCoefficient
- 'display the pos. coefficient
- sldCondition(5) = EffType.conditionX.lPositiveSaturation
- 'display the pos. saturation
- Else 'otherwise, display all the info for the Y axis
- sldCondition(0) = EffType.conditionY.lDeadBand 'display the deadband value
- sldCondition(1) = EffType.conditionY.lNegativeCoefficient
- 'display the neg. coefficient
- sldCondition(2) = EffType.conditionY.lNegativeSaturation
- 'display the neg. saturation
- sldCondition(3) = EffType.conditionY.lOffset 'display the offset
- sldCondition(4) = EffType.conditionY.lPositiveCoefficient
- 'display the pos. coefficient
- sldCondition(5) = EffType.conditionY.lPositiveSaturation
- 'display the pos. saturation
- End If
- Select Case EffectParams(lstEffects.ListIndex)
- 'Get the effect type of this effect from the type stored in
- 'the array.
- Case DIEFT_CONSTANTFORCE 'If this is a constant force effect
- frameConstantForce.Visible = True 'display the constant force frame
- Case DIEFT_RAMPFORCE 'If this is a ramp force effect
- frameRampForce.Visible = True 'Show the ramp force frame
- Case DIEFT_PERIODIC 'If this is a square force
- framePeriodic.Visible = True 'show the periodic effect frame
- Case DIEFT_CONDITION 'if this is a spring effect
- frameCondition.Visible = True 'show the condition frame
- Case Else 'this effect is a hardware effect with no type-specific parameters
- End Select
- End Sub
- Private Sub optConditionAxis_Click(Index As Integer)
- Call UpdateFrames 'Update the frames
- End Sub
- Private Sub optDirection_Click(Index As Integer)
- Call ChangeParameter("direction") 'Change the direction parameter
- End Sub
- Private Sub sldCondition_Change(Index As Integer)
- lblCondition(Index) = sldCondition(Index) 'display the value in the label
- Call ChangeParameter("condition") 'change the condition parameter
- End Sub
- Private Sub sldCondition_Scroll(Index As Integer)
- lblCondition(Index) = sldCondition(Index) 'display the value in the label
- Call ChangeParameter("condition") 'change the condition parameter
- End Sub
- Private Sub sldConstantForce_Change()
- lblConstantForce = sldConstantForce 'display the value
- Call ChangeParameter("constantforcemagnitude") 'change the parameter
- End Sub
- Private Sub sldDuration_Change()
- lblDuration = sldDuration \ 10 & " Milliseconds" 'show the value in milliseconds
- If sldDuration = 50001 Then lblDuration = "Infinite"
- 'if the value is 50,001 make sure that infinite is displayed
- Call ChangeParameter("duration") 'change the duration parameter
- End Sub
- Private Sub sldDuration_Scroll()
- lblDuration = sldDuration \ 10 & " Milliseconds" 'show the value in milliseconds
- If sldDuration = 50001 Then lblDuration = "Infinite"
- 'if the value is 50,001 make sure that infinite is displayed
- Call ChangeParameter("duration") 'change the duration parameter
- End Sub
- Private Sub sldEnvelope_Change(Index As Integer)
- lblEnvelope(Index) = sldEnvelope(Index) \ 1000 'show the value in milliseconds
- If chkEnvelope.Value = 1 Then 'if the envelope check box is checked
- Call ChangeParameter("envelope") 'change the envelope parameter
- End If
- End Sub
- Private Sub sldEnvelope_Scroll(Index As Integer)
- lblEnvelope(Index) = sldEnvelope(Index) \ 1000 'show the value in milliseconds
- If chkEnvelope.Value = 1 Then 'if the envelope check box is checked
- Call ChangeParameter("envelope") 'change the envelope parameter
- End If
- End Sub
- Private Sub sldGain_Change()
- lblGain = sldGain 'show the value
- Call ChangeParameter("gain") 'change the parameter
- End Sub
- Private Sub sldGain_Scroll()
- lblGain = sldGain 'show the value
- Call ChangeParameter("gain") 'change the parameter
- End Sub
- Private Sub sldPeriodic_Change(Index As Integer)
- lblPeriodic(Index) = sldPeriodic(Index) 'show the value
- Call ChangeParameter("periodic") 'change the parameter
-
- End Sub
- Private Sub sldrampRange_Change(Index As Integer)
- lblRange(Index) = sldRampRange(Index).Value 'show the value
- Call ChangeParameter("rampforce") 'change the parameter
- End Sub
- Private Sub sldSamplePeriod_Change()
- If sldSamplePeriod = 0 Then 'if the sample period is 0,
- lblSamplePeriod = "Default" 'display that it is the default
- Else 'otherwise
- lblSamplePeriod = sldSamplePeriod 'display the sample period
- End If
- Call ChangeParameter("samplerate") 'change the parameter
- End Sub
- Private Sub sldSamplePeriod_Scroll()
- If sldSamplePeriod = 0 Then 'if the sample period is 0,
- lblSamplePeriod = "Default" 'display that it is the default
- Else 'otherwise
- lblSamplePeriod = sldSamplePeriod 'display the sample period
- End If
- Call ChangeParameter("samplerate") 'change the parameter
- End Sub
-