Skip to content

Commit 8a0703a

Browse files
committed
segdisp: Wire up seg data.
1 parent 1bab1ab commit 8a0703a

File tree

1 file changed

+56
-36
lines changed

1 file changed

+56
-36
lines changed

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

Lines changed: 56 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
using System;
1818
using System.Collections.Generic;
1919
using System.Linq;
20+
using System.Runtime.InteropServices;
21+
using System.Text;
2022
using NLog;
2123
using PinMame;
2224
using UnityEngine;
@@ -75,11 +77,11 @@ public GamelogicEngineLamp[] AvailableLamps {
7577
private Dictionary<int, GamelogicEngineCoil> _coils = new Dictionary<int, GamelogicEngineCoil>();
7678
private Dictionary<int, GamelogicEngineLamp> _lamps = new Dictionary<int, GamelogicEngineLamp>();
7779

78-
private const string DisplayDmd = "dmd";
80+
private const string DisplayPrefix = "display";
7981

8082
private bool _isRunning;
81-
private bool _sizeAnnounced;
82-
private byte[] _frameBuffer;
83+
private HashSet<int> _displayAnnounced = new HashSet<int>();
84+
private Dictionary<int, byte[]> _frameBuffer = new Dictionary<int, byte[]>();
8385

8486
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
8587
private static readonly Color Tint = new Color(1, 0.18f, 0);
@@ -93,6 +95,8 @@ private void Start()
9395

9496
public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
9597
{
98+
_frameBuffer.Clear();
99+
96100
// turn off all lamps
97101
foreach (var lamp in _lamps.Values) {
98102
OnLampChanged?.Invoke(this, new LampEventArgs(lamp.Id, 0));
@@ -106,6 +110,7 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
106110
_player = player;
107111

108112
try {
113+
//_pinMame.StartGame("fh_906h");
109114
_pinMame.StartGame(romId);
110115

111116
} catch (Exception e) {
@@ -153,23 +158,17 @@ private void DisplayUpdated(object sender, EventArgs e, int index, IntPtr frameP
153158
}
154159
}
155160

156-
private void UpdateSegDisp(int index, PinMameDisplayLayout displayLayout, IntPtr framePtr)
157-
{
158-
159-
}
160-
161-
162161
private void UpdateDmd(int index, PinMameDisplayLayout displayLayout, IntPtr framePtr)
163162
{
164-
if (!_sizeAnnounced) {
163+
if (!_displayAnnounced.Contains(index)) {
165164
lock (_dispatchQueue) {
166165
_dispatchQueue.Enqueue(() =>
167166
OnDisplaysAvailable?.Invoke(this, new AvailableDisplays(
168-
new DisplayConfig(DisplayDmd, displayLayout.width, displayLayout.height))));
167+
new DisplayConfig($"{DisplayPrefix}{index}", displayLayout.width, displayLayout.height))));
169168
}
170169

171-
_sizeAnnounced = true;
172-
_frameBuffer = new byte[displayLayout.width * displayLayout.height];
170+
_displayAnnounced.Add(index);
171+
_frameBuffer[index] = new byte[displayLayout.width * displayLayout.height];
173172
}
174173

175174
var map = GetMap(displayLayout);
@@ -178,15 +177,38 @@ private void UpdateDmd(int index, PinMameDisplayLayout displayLayout, IntPtr fra
178177
for (var y = 0; y < displayLayout.height; y++) {
179178
for (var x = 0; x < displayLayout.width; x++) {
180179
var pos = y * displayLayout.width + x;
181-
_frameBuffer[pos] = map[ptr[pos]];
180+
_frameBuffer[index][pos] = map[ptr[pos]];
182181
}
183182
}
184183
}
185184

186185
lock (_dispatchQueue) {
187186
_dispatchQueue.Enqueue(() => OnDisplayFrame?.Invoke(this,
188-
new DisplayFrameData(DisplayDmd, GetDisplayType(displayLayout.type), _frameBuffer)));
187+
new DisplayFrameData($"{DisplayPrefix}{index}", GetDisplayType(displayLayout.type), _frameBuffer[index])));
188+
}
189+
}
190+
191+
private void UpdateSegDisp(int index, PinMameDisplayLayout displayLayout, IntPtr framePtr)
192+
{
193+
if (!_displayAnnounced.Contains(index)) {
194+
lock (_dispatchQueue) {
195+
_dispatchQueue.Enqueue(() =>
196+
OnDisplaysAvailable?.Invoke(this, new AvailableDisplays(
197+
new DisplayConfig($"{DisplayPrefix}{index}", displayLayout.length, 1))));
198+
}
199+
200+
_displayAnnounced.Add(index);
201+
_frameBuffer[index] = new byte[displayLayout.length * 2];
202+
}
203+
204+
Marshal.Copy(framePtr, _frameBuffer[index], 0, displayLayout.length * 2);
205+
206+
lock (_dispatchQueue) {
207+
Logger.Info($"[PinMAME] Seg data ({index}): {BitConverter.ToString(_frameBuffer[index])}" );
208+
_dispatchQueue.Enqueue(() => OnDisplayFrame?.Invoke(this,
209+
new DisplayFrameData($"{DisplayPrefix}{index}", GetDisplayType(displayLayout.type), _frameBuffer[index])));
189210
}
211+
190212
}
191213

192214
private void SolenoidChanged(object sender, EventArgs e, int internalId, bool isActive)
@@ -281,48 +303,46 @@ private Dictionary<byte, byte> GetMap(PinMameDisplayLayout displayLayout)
281303
private static DisplayFrameFormat GetDisplayType(PinMameDisplayType dp)
282304
{
283305
switch (dp) {
284-
case PinMameDisplayType.SEG16:
285-
break;
286-
case PinMameDisplayType.SEG16R:
287-
break;
288-
case PinMameDisplayType.SEG10:
306+
case PinMameDisplayType.SEG16: // 16 segments
307+
case PinMameDisplayType.SEG16R: // 16 segments with comma and period reversed
308+
case PinMameDisplayType.SEG16N: // 16 segments without commas
309+
case PinMameDisplayType.SEG16D: // 16 segments with periods only
310+
return DisplayFrameFormat.Segment16;
311+
312+
case PinMameDisplayType.SEG10: // 9 segments and comma
289313
break;
290-
case PinMameDisplayType.SEG9:
314+
case PinMameDisplayType.SEG9: // 9 segments
291315
break;
292-
case PinMameDisplayType.SEG8:
316+
case PinMameDisplayType.SEG8: // 7 segments and comma
293317
break;
294-
case PinMameDisplayType.SEG8D:
318+
case PinMameDisplayType.SEG8D: // 7 segments and period
295319
break;
296-
case PinMameDisplayType.SEG7:
320+
case PinMameDisplayType.SEG7: // 7 segments
297321
break;
298-
case PinMameDisplayType.SEG87:
322+
case PinMameDisplayType.SEG87: // 7 segments, comma every three
299323
break;
300-
case PinMameDisplayType.SEG87F:
324+
case PinMameDisplayType.SEG87F: // 7 segments, forced comma every three
301325
break;
302-
case PinMameDisplayType.SEG98:
326+
case PinMameDisplayType.SEG98: // 9 segments, comma every three
303327
break;
304-
case PinMameDisplayType.SEG98F:
328+
case PinMameDisplayType.SEG98F: // 9 segments, forced comma every three
305329
break;
306-
case PinMameDisplayType.SEG7S:
330+
case PinMameDisplayType.SEG7S: // 7 segments, small
307331
break;
308-
case PinMameDisplayType.SEG7SC:
332+
case PinMameDisplayType.SEG7SC: // 7 segments, small, with comma
309333
break;
310-
case PinMameDisplayType.SEG16S:
334+
case PinMameDisplayType.SEG16S: // 16 segments with split top and bottom line
311335
break;
312336
case PinMameDisplayType.DMD:
313337
return DisplayFrameFormat.Dmd2;
314338

315339
case PinMameDisplayType.VIDEO:
316340
break;
317-
case PinMameDisplayType.SEG16N:
318-
break;
319-
case PinMameDisplayType.SEG16D:
320-
break;
321341
default:
322342
throw new ArgumentOutOfRangeException(nameof(dp), dp, null);
323343
}
324344

325-
throw new NotImplementedException("only dmd frames supported for now");
345+
throw new NotImplementedException($"Still unsupported segmented display format: {dp}.");
326346
}
327347

328348
private static readonly Dictionary<byte, byte> DmdMap2Bit = new Dictionary<byte, byte> {

0 commit comments

Comments
 (0)