Skip to content

Commit ba5fb71

Browse files
Derive SpecificDeviceMessageHandler from MonitorBase
1 parent 6a58e3e commit ba5fb71

File tree

9 files changed

+101
-44
lines changed

9 files changed

+101
-44
lines changed

Runtime/MediaController/Messages/Device/Autofire/AutofireDeviceMessage.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.Autofire
1315
{
14-
public class AutofireDeviceMessage : SpecificDeviceMessageBase
16+
public class AutofireDeviceMessage
17+
: SpecificDeviceMessageBase,
18+
IEquatable<AutofireDeviceMessage>
1519
{
1620
public readonly bool Enabled;
1721

@@ -26,6 +30,11 @@ public static AutofireDeviceMessage FromStateJson(StateJson state, string device
2630
return new(deviceName, state.enabled);
2731
}
2832

33+
public bool Equals(AutofireDeviceMessage other)
34+
{
35+
return base.Equals(other) && Enabled == other.Enabled;
36+
}
37+
2938
public class StateJson
3039
{
3140
public bool enabled;

Runtime/MediaController/Messages/Device/BallDevice/BallDeviceMessage.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.BallDevice
1315
{
14-
public class BallDeviceMessage : SpecificDeviceMessageBase
16+
public class BallDeviceMessage : SpecificDeviceMessageBase, IEquatable<BallDeviceMessage>
1517
{
1618
public readonly int AvailableBalls;
1719
public readonly BallDeviceStatus Status;
@@ -39,6 +41,15 @@ public static BallDeviceMessage FromStateJson(StateJson state, string deviceName
3941
return new(deviceName, state.available_balls, status, state.state, state.balls);
4042
}
4143

44+
public bool Equals(BallDeviceMessage other)
45+
{
46+
return base.Equals(other)
47+
&& AvailableBalls == other.AvailableBalls
48+
&& Status == other.Status
49+
&& StatusAsString == other.StatusAsString
50+
&& Balls == other.Balls;
51+
}
52+
4253
public class StateJson
4354
{
4455
public int available_balls;

Runtime/MediaController/Messages/Device/ComboSwitch/ComboSwitchDeviceMessage.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.ComboSwitch
1315
{
14-
public class ComboSwitchDeviceMessage : SpecificDeviceMessageBase
16+
public class ComboSwitchDeviceMessage
17+
: SpecificDeviceMessageBase,
18+
IEquatable<ComboSwitchDeviceMessage>
1519
{
1620
public readonly ComboSwitchStatus Status;
1721

@@ -29,6 +33,11 @@ public static ComboSwitchDeviceMessage FromStateJson(StateJson state, string dev
2933
return new(deviceName, status);
3034
}
3135

36+
public bool Equals(ComboSwitchDeviceMessage other)
37+
{
38+
return base.Equals(other) && Status == other.Status;
39+
}
40+
3241
public class StateJson
3342
{
3443
public string state;

Runtime/MediaController/Messages/Device/Flipper/FlipperDeviceMessage.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.Flipper
1315
{
14-
public class FlipperDeviceMessage : SpecificDeviceMessageBase
16+
public class FlipperDeviceMessage : SpecificDeviceMessageBase, IEquatable<FlipperDeviceMessage>
1517
{
1618
public readonly bool Enabled;
1719

@@ -26,6 +28,11 @@ public static FlipperDeviceMessage FromStateJson(StateJson state, string deviceN
2628
return new(deviceName, state.enabled);
2729
}
2830

31+
public bool Equals(FlipperDeviceMessage other)
32+
{
33+
return base.Equals(other) && Enabled == other.Enabled;
34+
}
35+
2936
public class StateJson
3037
{
3138
public bool enabled;

Runtime/MediaController/Messages/Device/Light/LightDeviceMessage.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.Light
1616
{
17-
public class LightDeviceMessage : SpecificDeviceMessageBase
17+
public class LightDeviceMessage : SpecificDeviceMessageBase, IEquatable<LightDeviceMessage>
1818
{
1919
public const string Type = "light";
2020
public readonly Color LightColor;
@@ -44,6 +44,11 @@ public static LightDeviceMessage FromStateJson(StateJson state, string deviceNam
4444
return new LightDeviceMessage(deviceName, new Color(r, g, b));
4545
}
4646

47+
public bool Equals(LightDeviceMessage other)
48+
{
49+
return base.Equals(other) && LightColor == other.LightColor;
50+
}
51+
4752
public class StateJson
4853
{
4954
public int[] color;

Runtime/MediaController/Messages/Device/Playfield/PlayfieldDeviceMessage.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.Playfield
1315
{
14-
public class PlayfieldDeviceMessage : SpecificDeviceMessageBase
16+
public class PlayfieldDeviceMessage
17+
: SpecificDeviceMessageBase,
18+
IEquatable<PlayfieldDeviceMessage>
1519
{
1620
public readonly int AvailableBalls;
1721
public readonly int BallsRequested;
@@ -35,6 +39,14 @@ public static PlayfieldDeviceMessage FromStateJson(StateJson state, string devic
3539
return new(deviceName, state.available_balls, state.balls_requested, state.balls);
3640
}
3741

42+
public bool Equals(PlayfieldDeviceMessage other)
43+
{
44+
return base.Equals(other)
45+
&& AvailableBalls == other.AvailableBalls
46+
&& BallsRequested == other.BallsRequested
47+
&& Balls == other.Balls;
48+
}
49+
3850
public class StateJson
3951
{
4052
public int available_balls;

Runtime/MediaController/Messages/Device/SpecificDeviceMessageBase.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,24 @@
1313

1414
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device
1515
{
16-
public abstract class SpecificDeviceMessageBase : EventArgs
16+
public abstract class SpecificDeviceMessageBase
17+
: EventArgs,
18+
IEquatable<SpecificDeviceMessageBase>
1719
{
1820
public readonly string Name;
1921

2022
public SpecificDeviceMessageBase(string name)
2123
{
2224
Name = name;
2325
}
26+
27+
public bool Equals(SpecificDeviceMessageBase other)
28+
{
29+
if (other is null)
30+
return false;
31+
if (ReferenceEquals(this, other))
32+
return true;
33+
return Name == other.Name;
34+
}
2435
}
2536
}

Runtime/MediaController/Messages/Device/SpecificDeviceMessageHandler.cs

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,67 +15,51 @@
1515

1616
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device
1717
{
18-
public abstract class SpecificDeviceMessageHandler<TMessage, StateJsonFormat> : MonoBehaviour
19-
where TMessage : SpecificDeviceMessageBase
18+
public abstract class SpecificDeviceMessageHandler<TMessage, TDeviceState>
19+
: MonitorBase<TMessage, DeviceMessage>
20+
where TMessage : SpecificDeviceMessageBase, IEquatable<TMessage>
2021
{
2122
[SerializeField]
2223
private string _deviceName;
2324

24-
private BcpMessageHandler<DeviceMessage> _generalDeviceMessageHandler;
25-
25+
protected override string BcpCommand => DeviceMessage.Command;
2626
protected abstract string Type { get; }
2727
protected delegate TMessage ParseStateDelegate(
28-
StateJsonFormat deserializedState,
28+
TDeviceState deserializedState,
2929
string deviceName
3030
);
3131
protected abstract ParseStateDelegate ParseState { get; }
3232
public event EventHandler<TMessage> StateUpdated;
3333

34-
protected void OnEnable()
34+
protected override bool MatchesMonitoringCriteria(DeviceMessage msg)
3535
{
36-
var bcpInterface = MpfGamelogicEngine.GetBcpInterface(this);
37-
if (bcpInterface != null)
38-
{
39-
_generalDeviceMessageHandler =
40-
(BcpMessageHandler<DeviceMessage>)
41-
bcpInterface.MessageHandlers.Handlers[DeviceMessage.Command];
42-
_generalDeviceMessageHandler.Received += HandleDeviceMessageReceived;
43-
}
36+
return base.MatchesMonitoringCriteria(msg)
37+
&& msg.Type == Type
38+
&& msg.Name == _deviceName;
4439
}
4540

46-
protected void OnDisable()
41+
protected override void MessageHandler_Received(object sender, DeviceMessage msg)
4742
{
48-
if (_generalDeviceMessageHandler != null)
49-
_generalDeviceMessageHandler.Received -= HandleDeviceMessageReceived;
43+
if (msg.Change != null)
44+
HandleAttributeChange(msg.Change);
45+
46+
base.MessageHandler_Received(sender, msg);
5047
}
5148

52-
private void HandleDeviceMessageReceived(object sender, DeviceMessage deviceMessage)
49+
protected override TMessage GetValueFromMessage(DeviceMessage msg)
5350
{
54-
if (deviceMessage.Type != Type)
55-
return;
56-
57-
if (deviceMessage.Name != _deviceName)
58-
return;
59-
60-
if (deviceMessage.Change != null)
61-
HandleAttributeChange(deviceMessage.Change);
62-
63-
StateJsonFormat deserializedState;
51+
TDeviceState deserializedState;
6452
try
6553
{
66-
deserializedState = deviceMessage.State.ToObject<StateJsonFormat>();
54+
deserializedState = msg.State.ToObject<TDeviceState>();
6755
}
6856
catch (JsonException e)
6957
{
70-
throw new InvalidDeviceStateException(
71-
deviceMessage.Type,
72-
typeof(StateJsonFormat),
73-
e
74-
);
58+
throw new InvalidDeviceStateException(msg.Type, typeof(TDeviceState), e);
7559
}
7660

77-
TMessage specificDeviceMessage = ParseState(deserializedState, deviceMessage.Name);
78-
StateUpdated?.Invoke(this, specificDeviceMessage);
61+
TMessage specificDeviceMessage = ParseState(deserializedState, msg.Name);
62+
return specificDeviceMessage;
7963
}
8064

8165
protected abstract void HandleAttributeChange(DeviceAttributeChange change);

Runtime/MediaController/Messages/Device/Switch/SwitchDeviceMessage.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1010
// SOFTWARE.
1111

12+
using System;
13+
1214
namespace VisualPinball.Engine.Mpf.Unity.MediaController.Messages.Device.Switch
1315
{
14-
public class SwitchDeviceMessage : SpecificDeviceMessageBase
16+
public class SwitchDeviceMessage : SpecificDeviceMessageBase, IEquatable<SwitchDeviceMessage>
1517
{
1618
public readonly bool IsActive;
1719
public readonly int RecycleJitterCount;
@@ -28,6 +30,13 @@ public static SwitchDeviceMessage FromStateJson(StateJson state, string deviceNa
2830
return new(deviceName, state.state != 0, state.recycle_jitter_count);
2931
}
3032

33+
public bool Equals(SwitchDeviceMessage other)
34+
{
35+
return base.Equals(other)
36+
&& IsActive == other.IsActive
37+
&& RecycleJitterCount == other.RecycleJitterCount;
38+
}
39+
3140
public class StateJson
3241
{
3342
public int state;

0 commit comments

Comments
 (0)