BetterJoy/BetterJoyForCemu/Controller/OutputControllerXbox360.cs
Robert Borg 5290a152da
Formatting (#362)
* adds editorconfig to ensure coherent code style
* formats according to editorconfig
2020-05-21 15:19:53 +01:00

150 lines
4.6 KiB
C#

using Nefarius.ViGEm.Client.Targets;
using Nefarius.ViGEm.Client.Targets.Xbox360;
namespace BetterJoyForCemu.Controller {
public struct OutputControllerXbox360InputState {
// buttons
public bool thumb_stick_left;
public bool thumb_stick_right;
public bool y;
public bool x;
public bool b;
public bool a;
public bool start;
public bool back;
public bool guide;
public bool shoulder_left;
public bool shoulder_right;
// dpad
public bool dpad_up;
public bool dpad_right;
public bool dpad_down;
public bool dpad_left;
// axis
public short axis_left_x;
public short axis_left_y;
public short axis_right_x;
public short axis_right_y;
// triggers
public byte trigger_left;
public byte trigger_right;
public bool IsEqual(OutputControllerXbox360InputState other) {
bool buttons = thumb_stick_left == other.thumb_stick_left
&& thumb_stick_right == other.thumb_stick_right
&& y == other.y
&& x == other.x
&& b == other.b
&& a == other.a
&& start == other.start
&& back == other.back
&& guide == other.guide
&& shoulder_left == other.shoulder_left
&& shoulder_right == other.shoulder_right;
bool dpad = dpad_up == other.dpad_up
&& dpad_right == other.dpad_right
&& dpad_down == other.dpad_down
&& dpad_left == other.dpad_left;
bool axis = axis_left_x == other.axis_left_x
&& axis_left_y == other.axis_left_y
&& axis_right_x == other.axis_right_x
&& axis_right_y == other.axis_right_y;
bool triggers = trigger_left == other.trigger_left
&& trigger_right == other.trigger_right;
return buttons && dpad && axis && triggers;
}
}
public class OutputControllerXbox360 {
private IXbox360Controller xbox_controller;
private OutputControllerXbox360InputState current_state;
public delegate void Xbox360FeedbackReceivedEventHandler(Xbox360FeedbackReceivedEventArgs e);
public event Xbox360FeedbackReceivedEventHandler FeedbackReceived;
public OutputControllerXbox360() {
xbox_controller = Program.emClient.CreateXbox360Controller();
Init();
}
public OutputControllerXbox360(ushort vendor_id, ushort product_id) {
xbox_controller = Program.emClient.CreateXbox360Controller(vendor_id, product_id);
Init();
}
private void Init() {
xbox_controller.FeedbackReceived += FeedbackReceivedRcv;
xbox_controller.AutoSubmitReport = false;
}
private void FeedbackReceivedRcv(object _sender, Xbox360FeedbackReceivedEventArgs e) {
FeedbackReceived(e);
}
public bool UpdateInput(OutputControllerXbox360InputState new_state) {
if (current_state.IsEqual(new_state)) {
return false;
}
DoUpdateInput(new_state);
return true;
}
public void Connect() {
xbox_controller.Connect();
DoUpdateInput(new OutputControllerXbox360InputState());
}
public void Disconnect() {
xbox_controller.Disconnect();
}
private void DoUpdateInput(OutputControllerXbox360InputState new_state) {
xbox_controller.SetButtonState(Xbox360Button.LeftThumb, new_state.thumb_stick_left);
xbox_controller.SetButtonState(Xbox360Button.RightThumb, new_state.thumb_stick_right);
xbox_controller.SetButtonState(Xbox360Button.Y, new_state.y);
xbox_controller.SetButtonState(Xbox360Button.X, new_state.x);
xbox_controller.SetButtonState(Xbox360Button.B, new_state.b);
xbox_controller.SetButtonState(Xbox360Button.A, new_state.a);
xbox_controller.SetButtonState(Xbox360Button.Start, new_state.start);
xbox_controller.SetButtonState(Xbox360Button.Back, new_state.back);
xbox_controller.SetButtonState(Xbox360Button.Guide, new_state.guide);
xbox_controller.SetButtonState(Xbox360Button.Up, new_state.dpad_up);
xbox_controller.SetButtonState(Xbox360Button.Right, new_state.dpad_right);
xbox_controller.SetButtonState(Xbox360Button.Down, new_state.dpad_down);
xbox_controller.SetButtonState(Xbox360Button.Left, new_state.dpad_left);
xbox_controller.SetButtonState(Xbox360Button.LeftShoulder, new_state.shoulder_left);
xbox_controller.SetButtonState(Xbox360Button.RightShoulder, new_state.shoulder_right);
xbox_controller.SetAxisValue(Xbox360Axis.LeftThumbX, new_state.axis_left_x);
xbox_controller.SetAxisValue(Xbox360Axis.LeftThumbY, new_state.axis_left_y);
xbox_controller.SetAxisValue(Xbox360Axis.RightThumbX, new_state.axis_right_x);
xbox_controller.SetAxisValue(Xbox360Axis.RightThumbY, new_state.axis_right_y);
xbox_controller.SetSliderValue(Xbox360Slider.LeftTrigger, new_state.trigger_left);
xbox_controller.SetSliderValue(Xbox360Slider.RightTrigger, new_state.trigger_right);
xbox_controller.SubmitReport();
current_state = new_state;
}
}
}