1717using System ;
1818using System . Collections . Generic ;
1919using System . Linq ;
20+ using System . Runtime . InteropServices ;
21+ using System . Text ;
2022using NLog ;
2123using PinMame ;
2224using 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