Skip to content

Commit

Permalink
Fixed hotplug, reinitialisation.
Browse files Browse the repository at this point in the history
  • Loading branch information
smakhtin committed Nov 3, 2012
1 parent 3901ab3 commit e82b2f6
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 47 deletions.
107 changes: 63 additions & 44 deletions Xbox360Controller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Globalization;
using SlimDX.DirectInput;
using VVVV.PluginInterfaces.V2;

using SlimDX;
Expand Down Expand Up @@ -83,62 +82,82 @@ public class Xbox360Controller : IPluginEvaluate, IPartImportsSatisfiedNotificat
[Import]
ILogger Flogger;

private readonly List<GamepadState> FGamepads = new List<GamepadState>(4);
private readonly DirectInput FDirectInput = new DirectInput();
private readonly List<GamepadState> FAllGamepads = new List<GamepadState>(4);
private readonly List<GamepadState> FConnectedGamepads = new List<GamepadState>(4);
private readonly List<GamepadState> FSelectedGamepads = new List<GamepadState>(4);
private int FGamepadsCount;

#endregion fields & pins

public void OnImportsSatisfied()
{
CheckDevices();
for (int i = 0; i < 4; i++)
{
var gamepad = new GamepadState((UserIndex)i);
FAllGamepads.Add(gamepad);
}

CheckConnectedDevices();
}

private void CheckDevices()
private void CheckConnectedDevices()
{
var devices = FDirectInput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly);
FConnectedGamepads.Clear();

if(devices.Count == 0) return;

for (int i = 0; i < devices.Count; i++)
for (int i = 0; i < 4; i++)
{
if (!devices[i].InstanceName.Contains("XBOX")) devices.RemoveAt(i);
if(FAllGamepads[i].Connected)
{
FConnectedGamepads.Add(FAllGamepads[i]);
}
}

string[] names = new string[devices.Count];
string[] names;

if(FConnectedGamepads.Count == 0)
{
names = new string[1];
names[0] = "(nil)";

EnumManager.UpdateEnum(ControllersEnumName, names[0], names);
return;
}

for (int j = 0; j < devices.Count; j++)
names = new string[FConnectedGamepads.Count];
for (int j = 0; j < FConnectedGamepads.Count; j++)
{
names[j] = devices[j].InstanceName + " #" + j.ToString(CultureInfo.InvariantCulture);
names[j] = "XBOX 360 Controller Player " + FConnectedGamepads[j].UserIndex + " #" + j.ToString(CultureInfo.InvariantCulture);
}

EnumManager.UpdateEnum(ControllersEnumName, names[0], names);

InitControllers();
}

private void InitControllers()
{
FGamepads.Clear();
FSelectedGamepads.Clear();

for (int i = 0; i < FGamePadsEnumInput.SliceCount; i++)
{
EnumEntry entry = FGamePadsEnumInput[i];

if(entry == "(nil)") continue;
if(entry == "(nil)" || entry.Name == null) continue;

int sliceIndex = int.Parse(entry.Name.Split('#')[1]);

UserIndex index = (UserIndex) sliceIndex;
FGamepads.Add(new GamepadState(index));
if(sliceIndex >= FConnectedGamepads.Count) continue;

FSelectedGamepads.Add(FConnectedGamepads[sliceIndex]);
}

FGamepadsCount = FGamepads.Count;
FGamepadsCount = FSelectedGamepads.Count;
}

//called each frame by vvvv
public void Evaluate(int spreadMax)
{
if (FRefreshInput[0]) CheckDevices();
if (FRefreshInput[0]) CheckConnectedDevices();

if (FGamePadsEnumInput.IsChanged) InitControllers();

Expand All @@ -163,30 +182,30 @@ public void Evaluate(int spreadMax)

for (int i = 0; i < FGamepadsCount; i++)
{
FGamepads[i].Update();

FLeftThumbPin[i] = FGamepads[i].LeftStick.Position;
FLeftThumbPressPin[i] = FGamepads[i].LeftStick.Clicked;
FRightThumbPin[i] = FGamepads[i].RightStick.Position;
FRightThumbPressPin[i] = FGamepads[i].RightStick.Clicked;

FLeftTriggerPin[i] = FGamepads[i].LeftTrigger;
FLeftShoulderPin[i] = FGamepads[i].LeftShoulder;
FRightTriggerPin[i] = FGamepads[i].RightTrigger;
FRightShoulderPin[i] = FGamepads[i].RightShoulder;

FAButtonPin[i] = FGamepads[i].A;
FBButtonPin[i] = FGamepads[i].B;
FXButtonPin[i] = FGamepads[i].X;
FYButtonPin[i] = FGamepads[i].Y;

FDpadUpPin[i] = FGamepads[i].DPad.Up;
FDpadDownPin[i] = FGamepads[i].DPad.Down;
FDpadLeftPin[i] = FGamepads[i].DPad.Left;
FDpadRightPin[i] = FGamepads[i].DPad.Right;

FStartPin[i] = FGamepads[i].Start;
FBackPin[i] = FGamepads[i].Back;
FSelectedGamepads[i].Update();

FLeftThumbPin[i] = FSelectedGamepads[i].LeftStick.Position;
FLeftThumbPressPin[i] = FSelectedGamepads[i].LeftStick.Clicked;
FRightThumbPin[i] = FSelectedGamepads[i].RightStick.Position;
FRightThumbPressPin[i] = FSelectedGamepads[i].RightStick.Clicked;

FLeftTriggerPin[i] = FSelectedGamepads[i].LeftTrigger;
FLeftShoulderPin[i] = FSelectedGamepads[i].LeftShoulder;
FRightTriggerPin[i] = FSelectedGamepads[i].RightTrigger;
FRightShoulderPin[i] = FSelectedGamepads[i].RightShoulder;

FAButtonPin[i] = FSelectedGamepads[i].A;
FBButtonPin[i] = FSelectedGamepads[i].B;
FXButtonPin[i] = FSelectedGamepads[i].X;
FYButtonPin[i] = FSelectedGamepads[i].Y;

FDpadUpPin[i] = FSelectedGamepads[i].DPad.Up;
FDpadDownPin[i] = FSelectedGamepads[i].DPad.Down;
FDpadLeftPin[i] = FSelectedGamepads[i].DPad.Left;
FDpadRightPin[i] = FSelectedGamepads[i].DPad.Right;

FStartPin[i] = FSelectedGamepads[i].Start;
FBackPin[i] = FSelectedGamepads[i].Back;
}
}

Expand Down
60 changes: 57 additions & 3 deletions _test.v4p
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
</BOUNDS>
<PIN pinname="Left ThumbstickXY" visible="1">
</PIN>
<PIN pinname="Refresh" slicecount="1" values="0">
</PIN>
<PIN pinname="Device" slicecount="1" visible="1" values="|XBOX 360 Controller Player Three #0|,|XBOX 360 Controller Player Three #0|">
</PIN>
</NODE>
<NODE systemname="IOBox (Value Advanced)" nodename="IOBox (Value Advanced)" componentmode="InABox" id="8">
<BOUNDS type="Node" left="600" top="3285" width="100" height="100">
Expand All @@ -24,16 +28,66 @@
</NODE>
<LINK srcnodeid="5" srcpinname="Left ThumbstickXY" dstnodeid="8" dstpinname="Y Input Value">
</LINK>
<NODE systemname="IOBox (Enumerations)" nodename="IOBox (Enumerations)" componentmode="InABox" id="9">
<BOUNDS type="Node" left="600" top="480" width="100" height="100">
<NODE systemname="Vector (2d Split)" nodename="Vector (2d Split)" componentmode="Hidden" id="10">
<BOUNDS type="Node" left="2520" top="2640" width="100" height="100">
</BOUNDS>
<BOUNDS type="Box" left="600" top="480" width="1245" height="645">
<PIN pinname="XY" visible="1">
</PIN>
<PIN pinname="X" visible="1">
</PIN>
<PIN pinname="Y" visible="1">
</PIN>
</NODE>
<LINK srcnodeid="5" srcpinname="Left ThumbstickXY" dstnodeid="10" dstpinname="XY">
</LINK>
<NODE systemname="IOBox (Value Advanced)" nodename="IOBox (Value Advanced)" componentmode="InABox" id="12">
<BOUNDS type="Node" left="2520" top="4470" width="100" height="100">
</BOUNDS>
<BOUNDS type="Box" left="2520" top="4470" width="795" height="480">
</BOUNDS>
<PIN pinname="Rows" slicecount="1" values="2">
</PIN>
<PIN pinname="Y Input Value" slicecount="2" visible="1" values="0,0">
</PIN>
<PIN pinname="Vector Size" slicecount="1" values="2">
</PIN>
<PIN pinname="Default" slicecount="1" encoded="0" values="|0, 0|">
</PIN>
</NODE>
<LINK srcnodeid="10" srcpinname="X" dstnodeid="12" dstpinname="Y Input Value">
</LINK>
<NODE systemname="IOBox (Value Advanced)" nodename="IOBox (Value Advanced)" componentmode="InABox" id="13">
<BOUNDS type="Node" left="3075" top="3825" width="100" height="100">
</BOUNDS>
<BOUNDS type="Box" left="3075" top="3825" width="795" height="480">
</BOUNDS>
<PIN pinname="Rows" slicecount="1" values="2">
</PIN>
<PIN pinname="Y Input Value" slicecount="2" visible="1" values="0,0">
</PIN>
<PIN pinname="Vector Size" slicecount="1" values="2">
</PIN>
<PIN pinname="Default" slicecount="1" encoded="0" values="|0, 0|">
</PIN>
</NODE>
<LINK srcnodeid="10" srcpinname="Y" dstnodeid="13" dstpinname="Y Input Value">
</LINK>
<NODE id="9" systemname="IOBox (Enumerations)" nodename="IOBox (Enumerations)" componentmode="InABox">
<PIN pinname="Input Enum" slicecount="2" values="|XBOX 360 Controller Player One #0|,|XBOX 360 Controller Player Two #1|">
</PIN>
<BOUNDS type="Node" left="615" top="495" width="100" height="100">
</BOUNDS>
<BOUNDS type="Box" left="615" top="495" width="3480" height="720">
</BOUNDS>
<PIN pinname="Rows" slicecount="1" values="2">
</PIN>
<PIN pinname="Show SliceIndex" slicecount="1" values="1">
</PIN>
<PIN pinname="SliceCount Mode" slicecount="1" values="ColsRowsPages">
</PIN>
<PIN pinname="Output Enum" visible="1">
</PIN>
</NODE>
<LINK srcnodeid="9" srcpinname="Output Enum" dstnodeid="5" dstpinname="Device">
</LINK>
</PATCH>

0 comments on commit e82b2f6

Please sign in to comment.