Skip to content

Commit 91fc50f

Browse files
committed
fix: Add internal ID to lamp event so we can match the proper channel for RGB lamps.
1 parent b320a4c commit 91fc50f

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,15 @@ public CoilEventArgs(string id, bool isEnabled)
228228
public readonly struct LampEventArgs
229229
{
230230
/// <summary>
231-
/// Id of the lamp, as defined by <see cref="IGamelogicEngine.RequestedLamps"/>.
231+
/// ID of the lamp, as defined by <see cref="IGamelogicEngine.RequestedLamps"/>.
232232
/// </summary>
233233
public readonly string Id;
234234

235+
/// <summary>
236+
/// Internal ID of the lamp. Some lamps have multiple internal IDs per ID, like RGBs.
237+
/// </summary>
238+
public readonly int InternalId;
239+
235240
/// <summary>
236241
/// The intensity of the light. The range is dependent on the GLE,
237242
/// i.e. PinMAME sends 0-255 or sometimes 0-8 for GI. MPF sends 0-1.
@@ -252,6 +257,16 @@ public readonly struct LampEventArgs
252257
public LampEventArgs(string id, float value, LampSource source = LampSource.Lamp)
253258
{
254259
Id = id;
260+
InternalId = int.TryParse(id, out var internalId) ? internalId : 0;
261+
Value = value;
262+
Source = source;
263+
IsCoil = false;
264+
}
265+
266+
public LampEventArgs(string id, int internalId, float value, LampSource source = LampSource.Lamp)
267+
{
268+
Id = id;
269+
InternalId = internalId;
255270
Value = value;
256271
Source = source;
257272
IsCoil = false;
@@ -260,6 +275,7 @@ public LampEventArgs(string id, float value, LampSource source = LampSource.Lamp
260275
public LampEventArgs(string id, float value, bool isCoil, LampSource source = LampSource.Lamp)
261276
{
262277
Id = id;
278+
InternalId = int.TryParse(id, out var internalId) ? internalId : 0;
263279
Value = value;
264280
Source = source;
265281
IsCoil = isCoil;

VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,18 @@ public void OnStart()
9292
private void HandleLampsEvent(object sender, LampsEventArgs lampsEvent)
9393
{
9494
foreach (var lampEvent in lampsEvent.LampsChanged) {
95-
Apply(lampEvent.Id, lampEvent.Source, lampEvent.IsCoil, (state, lamp, mapping) => ApplyValue(lampEvent.Id, lampEvent.Value, state, lamp, mapping));
95+
Apply(lampEvent.Id, lampEvent.Source, lampEvent.IsCoil, (state, lamp, mapping) => ApplyValue(lampEvent.Id, lampEvent.InternalId, lampEvent.Value, state, lamp, mapping));
9696
}
9797
}
9898

9999
private void HandleLampEvent(object sender, LampEventArgs lampEvent)
100100
{
101-
Apply(lampEvent.Id, lampEvent.Source, lampEvent.IsCoil, (state, lamp, mapping) => ApplyValue(lampEvent.Id, lampEvent.Value, state, lamp, mapping));
101+
Apply(lampEvent.Id, lampEvent.Source, lampEvent.IsCoil, (state, lamp, mapping) => ApplyValue(lampEvent.Id, lampEvent.InternalId, lampEvent.Value, state, lamp, mapping));
102102
}
103103

104104
public void HandleLampEvent(string id, float value)
105105
{
106-
Apply(id, LampSource.Lamp, false, (state, lamp, mapping) => ApplyValue(id, value, state, lamp, mapping));
106+
Apply(id, LampSource.Lamp, false, (state, lamp, mapping) => ApplyValue(id, int.TryParse(id, out var internalId) ? internalId : 0, value, state, lamp, mapping));
107107
}
108108

109109
public void HandleLampEvent(string id, LampStatus status)
@@ -163,7 +163,7 @@ private void ApplyColor(string id, Color color, LampState state, IApiLamp? lamp)
163163
lamp?.OnLamp(state.Color.ToUnityColor());
164164
}
165165

166-
private void ApplyValue(string id, float value, LampState state, IApiLamp? lamp, LampMapping? mapping)
166+
private void ApplyValue(string id, int internalId, float value, LampState state, IApiLamp? lamp, LampMapping? mapping)
167167
{
168168
if (mapping == null) {
169169
// if not mapped, there is no lamp, so just save the state.
@@ -188,9 +188,11 @@ private void ApplyValue(string id, float value, LampState state, IApiLamp? lamp,
188188
break;
189189

190190
case LampType.RgbMulti:
191-
state.SetChannel(mapping.Channel, value / 255f); // todo test
192-
LampStates[id] = state;
193-
lamp?.OnLamp(state.Color.ToUnityColor());
191+
if (mapping.InternalId == internalId) {
192+
state.SetChannel(mapping.Channel, value / 255f);
193+
LampStates[id] = state;
194+
lamp?.OnLamp(state.Color.ToUnityColor());
195+
}
194196
break;
195197

196198
case LampType.SingleFading:

0 commit comments

Comments
 (0)