Skip to content

Commit b858a9e

Browse files
committed
gle: added solenoid startup delay and mech disable settings
1 parent 964927f commit b858a9e

File tree

2 files changed

+113
-25
lines changed

2 files changed

+113
-25
lines changed

VisualPinball.Engine.PinMAME.Unity/Editor/PinMameGamelogicEngineInspector.cs

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,15 @@ public class PinMameGamelogicEngineInspector : UnityEditor.Editor
4545

4646
private PinMameRom Rom => _gle.Game.Roms[_selectedRomIndex];
4747

48+
private bool _toggleStartup = true;
49+
50+
private SerializedProperty _disableMechsProperty;
51+
private SerializedProperty _solenoidDelayProperty;
52+
4853
private void OnEnable()
4954
{
5055
_gle = (PinMameGamelogicEngine) target;
56+
5157
_games = new PinMameGame[] {
5258
new AttackFromMars(),
5359
new CreatureFromTheBlackLagoon(),
@@ -81,12 +87,15 @@ private void OnEnable()
8187
}
8288
}
8389
}
84-
}
90+
}
91+
92+
_solenoidDelayProperty = serializedObject.FindProperty(nameof(_gle.SolenoidDelay));
93+
_disableMechsProperty = serializedObject.FindProperty(nameof(_gle.DisableMechs));
8594
}
8695

8796
public override void OnInspectorGUI()
88-
{
89-
// game dropdown
97+
{
98+
// game dropdown
9099
//_gle.romId = EditorGUILayout.TextField("ROM ID", _gle.romId);
91100

92101
EditorGUI.BeginChangeCheck();
@@ -116,7 +125,46 @@ public override void OnInspectorGUI()
116125
// info label
117126
EditorGUILayout.LabelField("ROM ID", _gle.romId);
118127

119-
EditorGUI.EndDisabledGroup();
128+
EditorGUI.EndDisabledGroup();
129+
130+
GUILayout.BeginVertical();
131+
132+
if (_toggleStartup = EditorGUILayout.BeginFoldoutHeaderGroup(_toggleStartup, "Startup"))
133+
{
134+
EditorGUI.indentLevel++;
135+
136+
EditorGUI.BeginChangeCheck();
137+
138+
EditorGUILayout.PropertyField(_disableMechsProperty, new GUIContent("Disable Mechs"));
139+
140+
if (EditorGUI.EndChangeCheck())
141+
{
142+
serializedObject.ApplyModifiedProperties();
143+
}
144+
145+
EditorGUI.BeginChangeCheck();
146+
147+
var cellRect = EditorGUILayout.GetControlRect();
148+
149+
var labelRect = cellRect;
150+
labelRect.x += labelRect.width - 20;
151+
labelRect.width = 20;
152+
153+
var fieldRect = cellRect;
154+
fieldRect.width -= 25;
155+
156+
EditorGUI.PropertyField(fieldRect, _solenoidDelayProperty, new GUIContent("Solenoid Delay"));
157+
GUI.Label(labelRect, "ms");
158+
159+
if (EditorGUI.EndChangeCheck())
160+
{
161+
serializedObject.ApplyModifiedProperties();
162+
}
163+
164+
EditorGUI.indentLevel--;
165+
}
166+
167+
GUILayout.EndVertical();
120168

121169
EditorGUILayout.Space();
122170
EditorGUILayout.Separator();
@@ -142,8 +190,8 @@ public override void OnInspectorGUI()
142190
}
143191
}
144192
//EditorGUI.EndDisabledGroup();
145-
}
146-
193+
}
194+
147195
private void CreateDisplays(IEnumerable<DisplayComponent> sceneDisplays)
148196
{
149197
// retrieve layouts from pinmame

VisualPinball.Engine.PinMAME.Unity/Runtime/PinMameGamelogicEngine.cs

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,15 @@ public class PinMameGamelogicEngine : MonoBehaviour, IGamelogicEngine
4545
public PinMameGame Game { get => _game; set => _game = value; }
4646

4747
[HideInInspector]
48-
public string romId = string.Empty;
49-
48+
public string romId = string.Empty;
49+
50+
[Tooltip("Disable built in mechs")]
51+
public bool DisableMechs = true;
52+
53+
[Min(0f)]
54+
[Tooltip("Delay after startup to listen for solenoid events.")]
55+
public float SolenoidDelay = 0;
56+
5057
public GamelogicEngineSwitch[] AvailableSwitches {
5158
get {
5259
UpdateCaches();
@@ -102,7 +109,10 @@ public GamelogicEngineLamp[] AvailableLamps {
102109
private double _audioInputStart;
103110
private double _audioOutputStart;
104111
private int _audioNumSamplesInput;
105-
private int _audioNumSamplesOutput;
112+
private int _audioNumSamplesOutput;
113+
114+
public bool _solenoidsEnabled;
115+
public long _solenoidDelayStart;
106116

107117
private void Awake()
108118
{
@@ -118,8 +128,8 @@ private void Start()
118128
}
119129

120130
public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
121-
{
122-
// turn off all lamps
131+
{
132+
// turn off all lamps
123133
foreach (var lamp in _lamps.Values) {
124134
OnLampChanged?.Invoke(this, new LampEventArgs(lamp.Id, 0));
125135
}
@@ -130,8 +140,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
130140
_pinMame.SetHandleKeyboard(false);
131141
_pinMame.SetHandleMechanics(false);
132142

133-
_pinMame.OnGameStarted += GameStarted;
134-
_pinMame.OnGameEnded += GameEnded;
143+
_pinMame.OnGameStarted += OnGameStarted;
144+
_pinMame.OnGameEnded += OnGameEnded;
135145
_pinMame.OnDisplayAvailable += OnDisplayAvailable;
136146
_pinMame.OnDisplayUpdated += OnDisplayUpdated;
137147
_pinMame.OnAudioAvailable += OnAudioAvailable;
@@ -141,6 +151,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
141151
_pinMame.OnSolenoidUpdated += OnSolenoidUpdated;
142152
_player = player;
143153

154+
_solenoidsEnabled = SolenoidDelay == 0;
155+
144156
try {
145157
_pinMame.StartGame(romId);
146158

@@ -149,12 +161,24 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
149161
}
150162
}
151163

152-
private void GameStarted()
164+
private void OnGameStarted()
153165
{
154166
Logger.Info($"[PinMAME] Game started.");
155167
_isRunning = true;
156168

169+
if (DisableMechs)
170+
{
171+
for (int id = 0; id < 10; id++)
172+
{
173+
Logger.Info($"Disabling mech {id}");
174+
175+
_pinMame.SetMech(id, null);
176+
}
177+
}
178+
157179
SendInitialSwitches();
180+
181+
_solenoidDelayStart = DateTimeOffset.Now.ToUnixTimeMilliseconds();
158182
}
159183

160184
private void Update()
@@ -388,23 +412,39 @@ private void OnMechUpdated(int mechNo, PinMame.PinMameMechInfo mechInfo)
388412
private void OnSolenoidUpdated(int internalId, bool isActive)
389413
{
390414
if (_coils.ContainsKey(internalId))
391-
{
392-
Logger.Info($"[PinMAME] <= coil {_coils[internalId].Id} ({internalId}): {isActive} | {_coils[internalId].Description}");
393-
394-
lock (_dispatchQueue)
395-
{
396-
_dispatchQueue.Enqueue(() =>
397-
OnCoilChanged?.Invoke(this, new CoilEventArgs(_coils[internalId].Id, isActive)));
415+
{
416+
if (!_solenoidsEnabled)
417+
{
418+
_solenoidsEnabled = (DateTimeOffset.Now.ToUnixTimeMilliseconds() - _solenoidDelayStart) >= SolenoidDelay;
419+
420+
if (_solenoidsEnabled)
421+
{
422+
Logger.Info($"Solenoids enabled, {SolenoidDelay}ms passed");
423+
}
424+
}
425+
426+
if (_solenoidsEnabled)
427+
{
428+
Logger.Info($"[PinMAME] <= coil {_coils[internalId].Id} ({internalId}): {isActive} | {_coils[internalId].Description}");
429+
430+
lock (_dispatchQueue)
431+
{
432+
_dispatchQueue.Enqueue(() =>
433+
OnCoilChanged?.Invoke(this, new CoilEventArgs(_coils[internalId].Id, isActive)));
434+
}
435+
}
436+
else
437+
{
438+
Logger.Info($"[PinMAME] <= solenoids disabled, coil {_coils[internalId].Id} ({internalId}): {isActive} | {_coils[internalId].Description}");
398439
}
399-
400440
}
401441
else
402442
{
403443
Logger.Warn($"[PinMAME] <= coil UNMAPPED {internalId}: {isActive}");
404444
}
405445
}
406446

407-
private void GameEnded()
447+
private void OnGameEnded()
408448
{
409449
Logger.Info($"[PinMAME] Game ended.");
410450
_isRunning = false;
@@ -455,8 +495,8 @@ public void StopGame()
455495
{
456496
if (_pinMame != null) {
457497
_pinMame.StopGame();
458-
_pinMame.OnGameStarted -= GameStarted;
459-
_pinMame.OnGameEnded -= GameEnded;
498+
_pinMame.OnGameStarted -= OnGameStarted;
499+
_pinMame.OnGameEnded -= OnGameEnded;
460500
_pinMame.OnDisplayAvailable -= OnDisplayAvailable;
461501
_pinMame.OnDisplayUpdated -= OnDisplayUpdated;
462502
_pinMame.OnAudioAvailable -= OnAudioAvailable;

0 commit comments

Comments
 (0)