@@ -110,7 +110,7 @@ namespace {schema.Name};
110110 if ( groupHasChangeDetection )
111111 {
112112 hasChangeDetection = true ;
113- mainWriter . WriteLine ( "\t \t private readonly Action<string, string, Level> ? _onBitfieldChanged;" ) ;
113+ mainWriter . WriteLine ( "\t \t private readonly BitfieldChangedCallback ? _onBitfieldChanged;" ) ;
114114 }
115115 groupFieldInitialisers . Add ( "_offset = offset;" ) ;
116116 if ( groupHasChangeDetection )
@@ -148,7 +148,7 @@ namespace {schema.Name};
148148
149149 if ( hasChangeDetection )
150150 {
151- mainWriter . WriteLine ( "\t private readonly Action<string, string, Level> ? _onBitfieldChanged;" ) ;
151+ mainWriter . WriteLine ( "\t private readonly BitfieldChangedCallback ? _onBitfieldChanged;" ) ;
152152 }
153153 WriteFieldsAndConstructor ( schema . Name + "Client" , mainWriter , bufferInitialisers , fieldInitialisers , constructorParams , hasChangeDetection : hasChangeDetection ) ;
154154 mainWriter . WriteLine ( "}" ) ;
@@ -169,7 +169,7 @@ private static void WriteFieldsAndConstructor(string name, StringWriter mainWrit
169169 }
170170 if ( hasChangeDetection )
171171 {
172- mainWriter . Write ( ", Action<string, string, Level> ? onBitfieldChanged = null" ) ;
172+ mainWriter . Write ( ", BitfieldChangedCallback ? onBitfieldChanged = null" ) ;
173173 }
174174 mainWriter . WriteLine ( ")" ) ;
175175 mainWriter . WriteLine ( $ "{ indent } \t {{") ;
@@ -240,7 +240,10 @@ private static void WriteGroups(IReadOnlyCollection<Group> groups, StringWriter
240240 mainWriter . WriteLine ( $ "\t \t { indent } await _client.Read{ group . Table } Async({ readOffsetField } { group . BaseRegister } , { bufferName } );") ;
241241 if ( groupBitfieldPoints . Count > 0 )
242242 {
243- mainWriter . WriteLine ( $ "\t \t { indent } if (_onBitfieldChanged is not null) Check{ group . Name } ();") ;
243+ mainWriter . WriteLine ( $ "\t \t { indent } if (_onBitfieldChanged is not null)") ;
244+ mainWriter . WriteLine ( $ "\t \t { indent } {{") ;
245+ mainWriter . WriteLine ( $ "\t \t \t { indent } Check{ group . Name } ();") ;
246+ mainWriter . WriteLine ( $ "\t \t { indent } }}") ;
244247 }
245248 mainWriter . WriteLine ( $ "\t { indent } }}") ;
246249 mainWriter . WriteLine ( ) ;
@@ -250,7 +253,10 @@ private static void WriteGroups(IReadOnlyCollection<Group> groups, StringWriter
250253 mainWriter . WriteLine ( $ "\t \t { indent } _client.Read{ group . Table } ({ readOffsetField } { group . BaseRegister } , { bufferName } .Span);") ;
251254 if ( groupBitfieldPoints . Count > 0 )
252255 {
253- mainWriter . WriteLine ( $ "\t \t { indent } if (_onBitfieldChanged is not null) Check{ group . Name } ();") ;
256+ mainWriter . WriteLine ( $ "\t \t { indent } if (_onBitfieldChanged is not null)") ;
257+ mainWriter . WriteLine ( $ "\t \t { indent } {{") ;
258+ mainWriter . WriteLine ( $ "\t \t \t { indent } Check{ group . Name } ();") ;
259+ mainWriter . WriteLine ( $ "\t \t { indent } }}") ;
254260 }
255261 mainWriter . WriteLine ( $ "\t { indent } }}") ;
256262 mainWriter . WriteLine ( ) ;
@@ -265,7 +271,8 @@ private static void WriteGroups(IReadOnlyCollection<Group> groups, StringWriter
265271 {
266272 mainWriter . WriteLine ( $ "\t \t { indent } if (!current.Slice({ bp . Offset } , { bp . SizeInBytes } ).SequenceEqual(previous.Slice({ bp . Offset } , { bp . SizeInBytes } )))") ;
267273 mainWriter . WriteLine ( $ "\t \t { indent } {{") ;
268- mainWriter . WriteLine ( $ "\t \t \t { indent } _onBitfieldChanged!(\" { bp . PointName } \" , { bp . PointName } .ToString(), { bp . PointName } .GetLevel());") ;
274+ mainWriter . WriteLine ( $ "\t \t \t { indent } { bp . PointName } oldValue = ({ bp . PointName } ){ bp . ReadMethod } (previous.Slice({ bp . Offset } , { bp . SizeInBytes } ));") ;
275+ mainWriter . WriteLine ( $ "\t \t \t { indent } _onBitfieldChanged!(\" { bp . PointName } \" , oldValue, { bp . PointName } , { bp . PointName } .GetLevel());") ;
269276 mainWriter . WriteLine ( $ "\t \t { indent } }}") ;
270277 }
271278 mainWriter . WriteLine ( $ "\t \t { indent } current.CopyTo(previous);") ;
@@ -403,7 +410,7 @@ private static void WritePoint(Point point, string bufferName, Table table, Stri
403410 appendixWriter . WriteLine ( ) ;
404411 if ( isFlags && masksByLevel . Count > 0 )
405412 {
406- groupBitfieldPoints ? . Add ( new BitfieldPointInfo ( point . Name , maxOffset , point . SizeInBytes ) ) ;
413+ groupBitfieldPoints ? . Add ( new BitfieldPointInfo ( point . Name , maxOffset , point . SizeInBytes , readMethod ) ) ;
407414 appendixWriter . WriteLine ( $ "public static class { point . Name } Extensions") ;
408415 appendixWriter . WriteLine ( "{" ) ;
409416 appendixWriter . WriteLine ( $ "\t public static Level GetLevel(this { point . Name } self)") ;
@@ -535,5 +542,5 @@ private static string Pluralise(string self)
535542 }
536543
537544 private record ConstructorParameter ( string Name , int Count ) ;
538- private record BitfieldPointInfo ( string PointName , int Offset , int SizeInBytes ) ;
545+ private record BitfieldPointInfo ( string PointName , int Offset , int SizeInBytes , string ReadMethod ) ;
539546}
0 commit comments