-
Notifications
You must be signed in to change notification settings - Fork 0
/
XboxInputDevice.cs
131 lines (110 loc) · 3.44 KB
/
XboxInputDevice.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
namespace BeeDevelopment.XboxControllerAnalyser {
internal class XboxInputDevice {
public enum ControllerType : byte {
GameController = 0x01,
DvdMoviePlaybackReceiver = 0x03,
};
public enum GameControllerSubType : byte {
Duke = 0x01,
ControllerS = 0x02,
SteeringWheel = 0x10,
ArcadeStick = 0x20,
LightGun = 0x50,
};
[Flags]
public enum GameControllerDigitalButtons : byte {
None = 0,
Up = 0x01,
Down = 0x02,
Left = 0x04,
Right = 0x08,
Start = 0x10,
Back = 0x20,
LeftStick = 0x40,
RightStick = 0x80,
};
[Flags]
public enum GameControllerLightGunFlags : byte {
None = 0,
LightVisible = 0x20,
Unknown1 = 0x40,
Unknown2 = 0x80,
};
public struct GameControllerInputState {
public GameControllerDigitalButtons DigitalButtons;
public GameControllerLightGunFlags LightGunFlags;
public byte A;
public byte B;
public byte X;
public byte Y;
public byte Black;
public byte White;
public byte LeftTrigger;
public byte RightTrigger;
public short LeftStickX;
public short LeftStickY;
public short RightStickX;
public short RightStickY;
public GameControllerInputState(byte[] report) {
this.DigitalButtons = (GameControllerDigitalButtons)report[2];
this.LightGunFlags = (GameControllerLightGunFlags)report[3];
this.A = report[4];
this.B = report[5];
this.X = report[6];
this.Y = report[7];
this.Black = report[8];
this.White = report[9];
this.LeftTrigger = report[10];
this.RightTrigger = report[11];
this.LeftStickX = (short)(report[12] | (report[13] << 8));
this.LeftStickY = (short)(report[14] | (report[15] << 8));
this.RightStickX = (short)(report[16] | (report[17] << 8));
this.RightStickY = (short)(report[18] | (report[19] << 8));
}
};
public struct GameControllerOutputState {
public ushort LeftActuatorStrength;
public ushort RightActuatorStrength;
public GameControllerOutputState(byte[] report) {
this.LeftActuatorStrength = (ushort)(report[2] | (report[3] << 8));
this.RightActuatorStrength = (ushort)(report[4] | (report[5] << 8));
}
public byte[] GetBytes() {
var report = new byte[6];
report[0] = 0;
report[1] = 6;
report[2] = (byte)this.LeftActuatorStrength;
report[3] = (byte)(this.LeftActuatorStrength >> 8);
report[4] = (byte)this.RightActuatorStrength;
report[5] = (byte)(this.RightActuatorStrength >> 8);
return report;
}
}
public struct GameControllerLightGunCalibrationState {
public short CentreXOffset;
public short CentreYOffset;
public short TopLeftXOffset;
public short TopLeftYOffset;
public GameControllerLightGunCalibrationState(byte[] report) {
this.CentreXOffset = (short)(report[2] | (report[3] << 8));
this.CentreYOffset = (short)(report[4] | (report[5] << 8));
this.TopLeftXOffset = (short)(report[6] | (report[7] << 8));
this.TopLeftYOffset = (short)(report[8] | (report[9] << 8));
}
public byte[] GetBytes() {
var report = new byte[10];
report[0] = 1;
report[1] = 10;
report[2] = (byte)this.CentreXOffset;
report[3] = (byte)(this.CentreXOffset >> 8);
report[4] = (byte)this.CentreYOffset;
report[5] = (byte)(this.CentreYOffset >> 8);
report[6] = (byte)this.TopLeftXOffset;
report[7] = (byte)(this.TopLeftXOffset >> 8);
report[8] = (byte)this.TopLeftYOffset;
report[9] = (byte)(this.TopLeftYOffset >> 8);
return report;
}
}
}
}