@@ -26,6 +26,7 @@ public static void Generate()
2626 Directory . CreateDirectory ( $ "outputs\\ Clusters\\ ") ;
2727 XmlSerializer deserializer = new XmlSerializer ( typeof ( Cluster ) ) ;
2828 IEnumerable < string > clusterxmls = Directory . EnumerateFiles ( "..\\ ..\\ ..\\ Clusters" ) ;
29+ StreamWriter clusterBase = new StreamWriter ( "outputs\\ ClusterBase.cs" ) ;
2930 foreach ( string clusterxml in clusterxmls )
3031 {
3132 includes . Clear ( ) ;
@@ -35,9 +36,11 @@ public static void Generate()
3536 Cluster ? cluster = deserializer . Deserialize ( File . OpenRead ( clusterxml ) ) as Cluster ;
3637 if ( cluster == null )
3738 throw new IOException ( "Failed to parse cluster " + clusterxml ) ;
39+ clusterBase . WriteLine ( $ " case { cluster . name . Replace ( " " , "" ) . Replace ( '/' , '_' ) } .CLUSTER_ID:\n return new { cluster . name . Replace ( " " , "" ) . Replace ( '/' , '_' ) } (endPoint);") ;
3840 WriteClass ( cluster ) ;
3941 }
4042 }
43+ clusterBase . Close ( ) ;
4144 }
4245
4346 private static void WriteClass ( Cluster cluster )
@@ -75,9 +78,10 @@ private static void WriteClass(Cluster cluster, TextWriter writer)
7578 writer . WriteLine ( " /// <summary>" ) ;
7679 writer . WriteLine ( $ " /// { cluster . name } ") ;
7780 writer . WriteLine ( " /// </summary>" ) ;
81+ writer . WriteLine ( $ " [ClusterRevision(CLUSTER_ID, { cluster . revision } )]") ;
7882 writer . WriteLine ( " public class " + cluster . name . Replace ( " " , "" ) . Replace ( '/' , '_' ) + " : ClusterBase" ) ;
7983 writer . WriteLine ( " {" ) ;
80- writer . WriteLine ( " private const uint CLUSTER_ID = " + cluster . clusterIds . clusterId . id + ";" ) ;
84+ writer . WriteLine ( " internal const uint CLUSTER_ID = " + cluster . clusterIds . clusterId . id + ";" ) ;
8185 writer . WriteLine ( ) ;
8286 writer . WriteLine ( " /// <summary>" ) ;
8387 writer . WriteLine ( $ " /// { cluster . name } ") ;
@@ -143,7 +147,7 @@ private static void WriteClass(Cluster cluster, TextWriter writer)
143147 if ( cluster . commands != null && cluster . commands . Length > 0 )
144148 {
145149 includes . Add ( "MatterDotNet.Messages.InteractionModel" ) ;
146- includes . Add ( "MatterDotNet.Protocol" ) ;
150+ includes . Add ( "MatterDotNet.Protocol.Subprotocols " ) ;
147151 writer . WriteLine ( " #region Payloads" ) ;
148152 bool firstPayload = true ;
149153 foreach ( var command in cluster . commands )
@@ -506,10 +510,10 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
506510 }
507511 }
508512
509- private static void WriteFieldReader ( bool optional , bool nullable , string type , string ? entryType , int id , int ? from , int ? to , string name , string structName , Cluster cluster , TextWriter writer )
513+ private static void WriteFieldReader ( bool optional , bool nullable , string type , string ? entryType , string id , int ? from , int ? to , string name , string structName , Cluster cluster , TextWriter writer )
510514 {
511515 string totalIndent = " " ;
512- if ( id != - 1 && type != "list" )
516+ if ( id != "-1" && type != "list" && id != "i ")
513517 {
514518 if ( name == GeneratorUtil . SanitizeName ( structName ) )
515519 writer . Write ( $ "{ totalIndent } { name } Field = ") ;
@@ -527,7 +531,7 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
527531 writer . WriteLine ( ">();" ) ;
528532 writer . WriteLine ( $ "{ totalIndent } foreach (var item in (List<object>)fields[{ id } ]) {{") ;
529533 writer . Write ( $ "{ totalIndent } { name } .Add(") ;
530- WriteFieldReader ( false , false , entryType ! , null , - 1 , null , null , "item" , structName , cluster , writer ) ;
534+ WriteFieldReader ( false , false , entryType ! , null , "-1" , null , null , "item" , structName , cluster , writer ) ;
531535 writer . WriteLine ( $ "{ totalIndent } }}") ;
532536 writer . WriteLine ( $ "{ totalIndent } }}") ;
533537 return ;
@@ -608,16 +612,16 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
608612 writer . Write ( $ "reader.GetDouble({ id } ") ;
609613 break ;
610614 case "ref_IpAdr" :
611- writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 16, 4{ ( id == - 1 ? ")!))" : ")!)" ) } ;") ;
615+ writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 16, 4{ ( id == "-1" || id == "i" ? ")!))" : ")!)" ) } ;") ;
612616 return ;
613617 case "ref_Ipv4Adr" :
614- writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 4, 4{ ( id == - 1 ? ")!))" : ")!)" ) } ;") ;
618+ writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 4, 4{ ( id == "-1" || id == "i" ? ")!))" : ")!)" ) } ;") ;
615619 return ;
616620 case "ref_Ipv6Adr" :
617- writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 16, 16{ ( id == - 1 ? ")!))" : ")!)" ) } ;") ;
621+ writer . WriteLine ( $ "new IPAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 16, 16{ ( id == "-1" || id == "i" ? ")!))" : ")!)" ) } ;") ;
618622 return ;
619623 case "Hardware Address" :
620- writer . WriteLine ( $ "new PhysicalAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 8, 6{ ( id == - 1 ? ")!))" : ")!)" ) } ;") ;
624+ writer . WriteLine ( $ "new PhysicalAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 8, 6{ ( id == "-1" || id == "i" ? ")!))" : ")!)" ) } ;") ;
621625 return ;
622626 case "octstr" :
623627 case "ipv6pre" :
@@ -631,7 +635,7 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
631635 writer . Write ( ')' ) ;
632636 if ( ! optional )
633637 writer . Write ( '!' ) ;
634- if ( id == - 1 )
638+ if ( id == "-1" || id == "i" )
635639 writer . WriteLine ( ");" ) ;
636640 else
637641 writer . WriteLine ( ';' ) ;
@@ -647,7 +651,7 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
647651 writer . Write ( ')' ) ;
648652 if ( ! optional )
649653 writer . Write ( '!' ) ;
650- if ( id == - 1 )
654+ if ( id == "-1" || id == "i" )
651655 writer . WriteLine ( ");" ) ;
652656 else
653657 writer . WriteLine ( ';' ) ;
@@ -658,20 +662,28 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
658662 writer . Write ( $ "({ type } )reader.GetUShort({ id } ") ;
659663 if ( optional )
660664 writer . Write ( ", true" ) ;
661- if ( id == - 1 )
665+ if ( id == "-1" || id == "i" )
662666 writer . WriteLine ( ")!.Value);" ) ;
663667 else
664668 writer . WriteLine ( ")!.Value;" ) ;
665669 }
666- else
667- writer . WriteLine ( $ "new { GeneratorUtil . SanitizeName ( type ) } ({ ( id == - 1 ? "(object[])item))" : "fields[{id}])" ) } ;") ;
670+ else {
671+ writer . Write ( $ "new ") ;
672+ WriteType ( type , entryType , writer ) ;
673+ if ( id == "-1" )
674+ writer . WriteLine ( "((object[])item));" ) ;
675+ else if ( id == "i" )
676+ writer . WriteLine ( "(reader.GetStruct(i)!));" ) ;
677+ else
678+ writer . WriteLine ( $ "fields[{ id } ]);") ;
679+ }
668680 return ;
669681 }
670682 if ( optional )
671683 writer . Write ( ", true)" ) ;
672684 else
673685 writer . Write ( ")!.Value" ) ;
674- if ( id == - 1 )
686+ if ( id == "-1" || id == "i" )
675687 writer . WriteLine ( ");" ) ;
676688 else
677689 writer . WriteLine ( ';' ) ;
@@ -875,7 +887,7 @@ private static void WriteStruct(clusterDataTypesStruct structType, Cluster clust
875887 writer . WriteLine ( $ " internal { GeneratorUtil . SanitizeName ( structType . name ) } (object[] fields) {{") ;
876888 writer . WriteLine ( " FieldReader reader = new FieldReader(fields);" ) ;
877889 foreach ( clusterDataTypesStructField field in structType . field )
878- WriteFieldReader ( field . mandatoryConform == null , field . quality ? . nullable == true , field . type , field . entry ? . type , field . id , field . constraint ? . fromSpecified == true ? field . constraint . from : null , field . constraint ? . toSpecified == true ? field . constraint . to : null , field . name , structType . name , cluster , writer ) ;
890+ WriteFieldReader ( field . mandatoryConform == null , field . quality ? . nullable == true , field . type , field . entry ? . type , field . id . ToString ( ) , field . constraint ? . fromSpecified == true ? field . constraint . from : null , field . constraint ? . toSpecified == true ? field . constraint . to : null , field . name , structType . name , cluster , writer ) ;
879891
880892 writer . WriteLine ( " }" ) ;
881893 foreach ( clusterDataTypesStructField field in structType . field )
@@ -1010,10 +1022,25 @@ private static void WriteAttribute(Cluster cluster, clusterAttribute attribute,
10101022 WriteType ( attribute . type , attribute . entry ? . type , writer ) ;
10111023 if ( attribute . quality ? . nullable == true )
10121024 writer . Write ( '?' ) ;
1013- writer . WriteLine ( "> Get" + attribute . name + " (SecureSession session) {" ) ;
1014- writer . Write ( " return " ) ;
1025+ writer . WriteLine ( "> Get" + attribute . name + "(SecureSession session) {" ) ;
1026+ if ( attribute . type != "list" )
1027+ writer . Write ( " return " ) ;
10151028 if ( HasStruct ( cluster , attribute . type ) )
10161029 writer . Write ( $ "new { GeneratorUtil . SanitizeName ( attribute . type ) } ((object[])(await GetAttribute(session, " + Convert . ToUInt16 ( attribute . id , 16 ) + "))!)" ) ;
1030+ else if ( attribute . type == "list" )
1031+ {
1032+ writer . Write ( " List<" ) ;
1033+ WriteType ( attribute . entry ! . type , null , writer ) ;
1034+ writer . Write ( "> list = new List<" ) ;
1035+ WriteType ( attribute . entry ! . type , null , writer ) ;
1036+ writer . WriteLine ( ">();" ) ;
1037+ writer . WriteLine ( $ " FieldReader reader = new FieldReader((IList<object>)(await GetAttribute(session, { Convert . ToUInt16 ( attribute . id , 16 ) } ))!);") ;
1038+ writer . WriteLine ( " for (int i = 0; i < reader.Count; i++)" ) ;
1039+ writer . Write ( " list.Add(" ) ;
1040+ WriteFieldReader ( false , false , attribute . entry ! . type , null , "i" , attribute . constraint ? . from , attribute . constraint ? . to , "" , "" , cluster , writer ) ;
1041+ writer . Write ( " return list" ) ;
1042+ hasDefault = false ;
1043+ }
10171044 else
10181045 {
10191046 writer . Write ( '(' ) ;
0 commit comments