ScpControl.Shared/Core/DualShockAxes.cs (326 lines of code) (raw):
using System;
using ScpControl.Shared.Utilities;
namespace ScpControl.Shared.Core
{
/// <summary>
/// Defines a DualShock axis state.
/// </summary>
public interface IDsAxisState
{
byte Value { get; set; }
bool IsEngaged { get; set; }
float Pressure { get; }
float Axis { get; }
}
/// <summary>
/// Implements a DualShock axis state.
/// </summary>
public class DsAxisState : IDsAxisState
{
public DsAxisState()
{
Value = 0x80;
}
/// <summary>
/// The current value of the axis in question.
/// </summary>
public byte Value { get; set; }
/// <summary>
/// True if the current value differs from the default value of the axis, false otherwise.
/// </summary>
public bool IsEngaged { get; set; }
/// <summary>
/// Gets the pressure value of the current button compatible with PCSX2s XInput/LilyPad mod.
/// </summary>
public float Pressure
{
get
{
return (Value & 0xFF) / 255.0f;
}
}
public float Axis
{
get { return DsMath.ToAxis(Value); }
}
}
/// <summary>
/// Defines a DualShock axis.
/// </summary>
public interface IDsAxis
{
byte DefaultValue { get; }
uint Offset { get; }
string Name { get; }
string DisplayName { get; }
}
/// <summary>
/// Implementes a DualShock axis.
/// </summary>
public class DsAxis : IDsAxis
{
#region Ctors
public DsAxis()
{
}
public DsAxis(string name)
{
Name = name;
}
#endregion
/// <summary>
/// The offset used to identify and access the appropriate byte in <see cref="ScpHidReport"/>.
/// </summary>
public uint Offset { get; protected set; }
/// <summary>
/// The short name of the axis.
/// </summary>
public string Name { get; private set; }
/// <summary>
/// The descriptive name of the axis.
/// </summary>
public string DisplayName { get; protected set; }
/// <summary>
/// The default value of the axis reported at non-engaged state.
/// </summary>
public byte DefaultValue { get; protected set; }
public override bool Equals(object obj)
{
var axis = obj as DsAxis;
return (axis != null && axis.Name.Equals(this.Name));
}
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
}
/// <summary>
/// Definition of a DualShock 3 axis.
/// </summary>
public class Ds3Axis : DsAxis
{
#region Ctors
public Ds3Axis(string name)
: base(name)
{
}
#endregion
#region Axes
private static readonly Lazy<IDsAxis> DsAxisNone = new Lazy<IDsAxis>(() => new Ds3Axis("None")
{
Offset = 0,
DisplayName = "None",
DefaultValue = 0x00
});
public static IDsAxis None
{
get { return DsAxisNone.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisLx = new Lazy<IDsAxis>(() => new Ds3Axis("Lx")
{
Offset = 14,
DisplayName = "Lx",
DefaultValue = 0x80
});
public static IDsAxis Lx
{
get { return DsAxisLx.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisLy = new Lazy<IDsAxis>(() => new Ds3Axis("Ly")
{
Offset = 15,
DisplayName = "Ly",
DefaultValue = 0x80
});
public static IDsAxis Ly
{
get { return DsAxisLy.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisRx = new Lazy<IDsAxis>(() => new Ds3Axis("Rx")
{
Offset = 16,
DisplayName = "Rx",
DefaultValue = 0x80
});
public static IDsAxis Rx
{
get { return DsAxisRx.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisRy = new Lazy<IDsAxis>(() => new Ds3Axis("Ry")
{
Offset = 17,
DisplayName = "Ry",
DefaultValue = 0x80
});
public static IDsAxis Ry
{
get { return DsAxisRy.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisUp = new Lazy<IDsAxis>(() => new Ds3Axis("Up")
{
Offset = 22,
DisplayName = "D-Pad up",
DefaultValue = 0x00
});
public static IDsAxis Up
{
get { return DsAxisUp.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisRight = new Lazy<IDsAxis>(() => new Ds3Axis("Right")
{
Offset = 23,
DisplayName = "D-Pad right",
DefaultValue = 0x00
});
public static IDsAxis Right
{
get { return DsAxisRight.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisDown = new Lazy<IDsAxis>(() => new Ds3Axis("Down")
{
Offset = 24,
DisplayName = "D-Pad down",
DefaultValue = 0x00
});
public static IDsAxis Down
{
get { return DsAxisDown.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisLeft = new Lazy<IDsAxis>(() => new Ds3Axis("Left")
{
Offset = 25,
DisplayName = "D-Pad left",
DefaultValue = 0x00
});
public static IDsAxis Left
{
get { return DsAxisLeft.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisL2 = new Lazy<IDsAxis>(() => new Ds3Axis("L2")
{
Offset = 26,
DisplayName = "L2",
DefaultValue = 0x00
});
public static IDsAxis L2
{
get { return DsAxisL2.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisR2 = new Lazy<IDsAxis>(() => new Ds3Axis("R2")
{
Offset = 27,
DisplayName = "R2",
DefaultValue = 0x00
});
public static IDsAxis R2
{
get { return DsAxisR2.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisL1 = new Lazy<IDsAxis>(() => new Ds3Axis("L1")
{
Offset = 28,
DisplayName = "L1",
DefaultValue = 0x00
});
public static IDsAxis L1
{
get { return DsAxisL1.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisR1 = new Lazy<IDsAxis>(() => new Ds3Axis("R1")
{
Offset = 29,
DisplayName = "R1",
DefaultValue = 0x00
});
public static IDsAxis R1
{
get { return DsAxisR1.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisTriangle = new Lazy<IDsAxis>(() => new Ds3Axis("Triangle")
{
Offset = 30,
DisplayName = "Triangle",
DefaultValue = 0x00
});
public static IDsAxis Triangle
{
get { return DsAxisTriangle.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisCircle = new Lazy<IDsAxis>(() => new Ds3Axis("Circle")
{
Offset = 31,
DisplayName = "Circle",
DefaultValue = 0x00
});
public static IDsAxis Circle
{
get { return DsAxisCircle.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisCross = new Lazy<IDsAxis>(() => new Ds3Axis("Cross")
{
Offset = 32,
DisplayName = "Cross",
DefaultValue = 0x00
});
public static IDsAxis Cross
{
get { return DsAxisCross.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisSquare = new Lazy<IDsAxis>(() => new Ds3Axis("Square")
{
Offset = 33,
DisplayName = "Square",
DefaultValue = 0x00
});
public static IDsAxis Square
{
get { return DsAxisSquare.Value; }
}
#endregion
}
/// <summary>
/// Definition of a DualShock 4 axis.
/// </summary>
public class Ds4Axis : DsAxis
{
#region Ctors
public Ds4Axis(string name)
: base(name)
{
}
#endregion
#region Axes
private static readonly Lazy<IDsAxis> DsAxisNone = new Lazy<IDsAxis>(() => new Ds4Axis("None")
{
Offset = 0,
DisplayName = "None",
DefaultValue = 0x00
});
public static IDsAxis None
{
get { return DsAxisNone.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisLx = new Lazy<IDsAxis>(() => new Ds4Axis("Lx")
{
Offset = 9,
DisplayName = "Lx",
DefaultValue = 0x80
});
public static IDsAxis Lx
{
get { return DsAxisLx.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisLy = new Lazy<IDsAxis>(() => new Ds4Axis("Ly")
{
Offset = 10,
DisplayName = "Ly",
DefaultValue = 0x80
});
public static IDsAxis Ly
{
get { return DsAxisLy.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisRx = new Lazy<IDsAxis>(() => new Ds4Axis("Rx")
{
Offset = 11,
DisplayName = "Rx",
DefaultValue = 0x80
});
public static IDsAxis Rx
{
get { return DsAxisRx.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisRy = new Lazy<IDsAxis>(() => new Ds4Axis("Ry")
{
Offset = 12,
DisplayName = "Ry",
DefaultValue = 0x80
});
public static IDsAxis Ry
{
get { return DsAxisRy.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisL2 = new Lazy<IDsAxis>(() => new Ds4Axis("L2")
{
Offset = 16,
DisplayName = "L2",
DefaultValue = 0x00
});
public static IDsAxis L2
{
get { return DsAxisL2.Value; }
}
private static readonly Lazy<IDsAxis> DsAxisR2 = new Lazy<IDsAxis>(() => new Ds4Axis("R2")
{
Offset = 17,
DisplayName = "R2",
DefaultValue = 0x00
});
public static IDsAxis R2
{
get { return DsAxisR2.Value; }
}
#endregion
}
}