17
17
using System ;
18
18
using System . Collections . Generic ;
19
19
using System . Linq ;
20
+ using System . Runtime . InteropServices ;
21
+ using System . Text ;
20
22
using NLog ;
21
23
using PinMame ;
22
24
using UnityEngine ;
@@ -75,11 +77,11 @@ public GamelogicEngineLamp[] AvailableLamps {
75
77
private Dictionary < int , GamelogicEngineCoil > _coils = new Dictionary < int , GamelogicEngineCoil > ( ) ;
76
78
private Dictionary < int , GamelogicEngineLamp > _lamps = new Dictionary < int , GamelogicEngineLamp > ( ) ;
77
79
78
- private const string DisplayDmd = "dmd " ;
80
+ private const string DisplayPrefix = "display " ;
79
81
80
82
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 [ ] > ( ) ;
83
85
84
86
private static readonly Logger Logger = LogManager . GetCurrentClassLogger ( ) ;
85
87
private static readonly Color Tint = new Color ( 1 , 0.18f , 0 ) ;
@@ -93,6 +95,8 @@ private void Start()
93
95
94
96
public void OnInit ( Player player , TableApi tableApi , BallManager ballManager )
95
97
{
98
+ _frameBuffer . Clear ( ) ;
99
+
96
100
// turn off all lamps
97
101
foreach ( var lamp in _lamps . Values ) {
98
102
OnLampChanged ? . Invoke ( this , new LampEventArgs ( lamp . Id , 0 ) ) ;
@@ -106,6 +110,7 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
106
110
_player = player ;
107
111
108
112
try {
113
+ //_pinMame.StartGame("fh_906h");
109
114
_pinMame . StartGame ( romId ) ;
110
115
111
116
} catch ( Exception e ) {
@@ -153,23 +158,17 @@ private void DisplayUpdated(object sender, EventArgs e, int index, IntPtr frameP
153
158
}
154
159
}
155
160
156
- private void UpdateSegDisp ( int index , PinMameDisplayLayout displayLayout , IntPtr framePtr )
157
- {
158
-
159
- }
160
-
161
-
162
161
private void UpdateDmd ( int index , PinMameDisplayLayout displayLayout , IntPtr framePtr )
163
162
{
164
- if ( ! _sizeAnnounced ) {
163
+ if ( ! _displayAnnounced . Contains ( index ) ) {
165
164
lock ( _dispatchQueue ) {
166
165
_dispatchQueue . Enqueue ( ( ) =>
167
166
OnDisplaysAvailable ? . Invoke ( this , new AvailableDisplays (
168
- new DisplayConfig ( DisplayDmd , displayLayout . width , displayLayout . height ) ) ) ) ;
167
+ new DisplayConfig ( $ " { DisplayPrefix } { index } " , displayLayout . width , displayLayout . height ) ) ) ) ;
169
168
}
170
169
171
- _sizeAnnounced = true ;
172
- _frameBuffer = new byte [ displayLayout . width * displayLayout . height ] ;
170
+ _displayAnnounced . Add ( index ) ;
171
+ _frameBuffer [ index ] = new byte [ displayLayout . width * displayLayout . height ] ;
173
172
}
174
173
175
174
var map = GetMap ( displayLayout ) ;
@@ -178,15 +177,38 @@ private void UpdateDmd(int index, PinMameDisplayLayout displayLayout, IntPtr fra
178
177
for ( var y = 0 ; y < displayLayout . height ; y ++ ) {
179
178
for ( var x = 0 ; x < displayLayout . width ; x ++ ) {
180
179
var pos = y * displayLayout . width + x ;
181
- _frameBuffer [ pos ] = map [ ptr [ pos ] ] ;
180
+ _frameBuffer [ index ] [ pos ] = map [ ptr [ pos ] ] ;
182
181
}
183
182
}
184
183
}
185
184
186
185
lock ( _dispatchQueue ) {
187
186
_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 ] ) ) ) ;
189
210
}
211
+
190
212
}
191
213
192
214
private void SolenoidChanged ( object sender , EventArgs e , int internalId , bool isActive )
@@ -281,48 +303,46 @@ private Dictionary<byte, byte> GetMap(PinMameDisplayLayout displayLayout)
281
303
private static DisplayFrameFormat GetDisplayType ( PinMameDisplayType dp )
282
304
{
283
305
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
289
313
break ;
290
- case PinMameDisplayType . SEG9 :
314
+ case PinMameDisplayType . SEG9 : // 9 segments
291
315
break ;
292
- case PinMameDisplayType . SEG8 :
316
+ case PinMameDisplayType . SEG8 : // 7 segments and comma
293
317
break ;
294
- case PinMameDisplayType . SEG8D :
318
+ case PinMameDisplayType . SEG8D : // 7 segments and period
295
319
break ;
296
- case PinMameDisplayType . SEG7 :
320
+ case PinMameDisplayType . SEG7 : // 7 segments
297
321
break ;
298
- case PinMameDisplayType . SEG87 :
322
+ case PinMameDisplayType . SEG87 : // 7 segments, comma every three
299
323
break ;
300
- case PinMameDisplayType . SEG87F :
324
+ case PinMameDisplayType . SEG87F : // 7 segments, forced comma every three
301
325
break ;
302
- case PinMameDisplayType . SEG98 :
326
+ case PinMameDisplayType . SEG98 : // 9 segments, comma every three
303
327
break ;
304
- case PinMameDisplayType . SEG98F :
328
+ case PinMameDisplayType . SEG98F : // 9 segments, forced comma every three
305
329
break ;
306
- case PinMameDisplayType . SEG7S :
330
+ case PinMameDisplayType . SEG7S : // 7 segments, small
307
331
break ;
308
- case PinMameDisplayType . SEG7SC :
332
+ case PinMameDisplayType . SEG7SC : // 7 segments, small, with comma
309
333
break ;
310
- case PinMameDisplayType . SEG16S :
334
+ case PinMameDisplayType . SEG16S : // 16 segments with split top and bottom line
311
335
break ;
312
336
case PinMameDisplayType . DMD :
313
337
return DisplayFrameFormat . Dmd2 ;
314
338
315
339
case PinMameDisplayType . VIDEO :
316
340
break ;
317
- case PinMameDisplayType . SEG16N :
318
- break ;
319
- case PinMameDisplayType . SEG16D :
320
- break ;
321
341
default :
322
342
throw new ArgumentOutOfRangeException ( nameof ( dp ) , dp , null ) ;
323
343
}
324
344
325
- throw new NotImplementedException ( "only dmd frames supported for now ") ;
345
+ throw new NotImplementedException ( $ "Still unsupported segmented display format: { dp } . ") ;
326
346
}
327
347
328
348
private static readonly Dictionary < byte , byte > DmdMap2Bit = new Dictionary < byte , byte > {
0 commit comments