Skip to content

Commit 621143a

Browse files
committed
Finish implementing cluster generation and regenerate initial clusters
Implement attribute writing
1 parent 45ab2cb commit 621143a

15 files changed

+1539
-166
lines changed

Generator/ClusterGenerator.cs

Lines changed: 405 additions & 60 deletions
Large diffs are not rendered by default.

Generator/Schema/Cluster.cs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,28 @@ public partial class Cluster
3333

3434
private clusterCommand[] commandsField;
3535

36+
private clusterFeature[] featuresField;
37+
3638
private string idField;
3739

3840
private string nameField;
3941

4042
private byte revisionField;
4143

44+
/// <remarks/>
45+
[System.Xml.Serialization.XmlArrayItemAttribute("feature", IsNullable = false)]
46+
public clusterFeature[] features
47+
{
48+
get
49+
{
50+
return this.featuresField;
51+
}
52+
set
53+
{
54+
this.featuresField = value;
55+
}
56+
}
57+
4258
/// <remarks/>
4359
public clusterRevisionHistory revisionHistory
4460
{
@@ -360,6 +376,77 @@ public string scope
360376
}
361377
}
362378

379+
/// <remarks/>
380+
[System.SerializableAttribute()]
381+
[System.ComponentModel.DesignerCategoryAttribute("code")]
382+
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
383+
public partial class clusterFeature
384+
{
385+
private byte bitField;
386+
387+
private string codeField;
388+
389+
private string nameField;
390+
391+
private string summaryField;
392+
393+
/// <remarks/>
394+
[System.Xml.Serialization.XmlAttributeAttribute()]
395+
public byte bit
396+
{
397+
get
398+
{
399+
return this.bitField;
400+
}
401+
set
402+
{
403+
this.bitField = value;
404+
}
405+
}
406+
407+
/// <remarks/>
408+
[System.Xml.Serialization.XmlAttributeAttribute()]
409+
public string code
410+
{
411+
get
412+
{
413+
return this.codeField;
414+
}
415+
set
416+
{
417+
this.codeField = value;
418+
}
419+
}
420+
421+
/// <remarks/>
422+
[System.Xml.Serialization.XmlAttributeAttribute()]
423+
public string name
424+
{
425+
get
426+
{
427+
return this.nameField;
428+
}
429+
set
430+
{
431+
this.nameField = value;
432+
}
433+
}
434+
435+
/// <remarks/>
436+
[System.Xml.Serialization.XmlAttributeAttribute()]
437+
public string summary
438+
{
439+
get
440+
{
441+
return this.summaryField;
442+
}
443+
set
444+
{
445+
this.summaryField = value;
446+
}
447+
}
448+
}
449+
363450
/// <remarks/>
364451
[System.SerializableAttribute()]
365452
[System.ComponentModel.DesignerCategoryAttribute("code")]

MatterDotNet/Clusters/AdministratorCommissioningCluster.cs

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// MatterDotNet Copyright (C) 2024
1+
// MatterDotNet Copyright (C) 2025
22
//
33
// This program is free software: you can redistribute it and/or modify
44
// it under the terms of the GNU Affero General Public License as published by
@@ -30,9 +30,20 @@ public class AdministratorCommissioningCluster : ClusterBase
3030
/// <summary>
3131
/// Administrator Commissioning Cluster
3232
/// </summary>
33-
public AdministratorCommissioningCluster(ushort endPoint) : base(endPoint) { }
33+
public AdministratorCommissioningCluster(ushort endPoint) : base(CLUSTER_ID, endPoint) { }
3434

3535
#region Enums
36+
/// <summary>
37+
/// Supported Features
38+
/// </summary>
39+
[Flags]
40+
public enum Feature {
41+
/// <summary>
42+
/// Node supports Basic Commissioning Method.
43+
/// </summary>
44+
Basic = 1,
45+
}
46+
3647
/// <summary>
3748
/// Commissioning Window Status
3849
/// </summary>
@@ -65,7 +76,7 @@ internal override void Serialize(TLVWriter writer, long structNumber = -1) {
6576
writer.WriteBytes(1, PAKEPasscodeVerifier);
6677
writer.WriteUShort(2, Discriminator);
6778
writer.WriteUInt(3, Iterations);
68-
writer.WriteBytes(4, Salt);
79+
writer.WriteBytes(4, Salt, 32, 16);
6980
writer.EndContainer();
7081
}
7182
}
@@ -93,7 +104,7 @@ public async Task<bool> OpenCommissioningWindow(SecureSession session, ushort Co
93104
Salt = Salt,
94105
};
95106
InvokeResponseIB resp = await InteractionManager.ExecCommand(session, endPoint, CLUSTER_ID, 0x00, requestFields);
96-
return validateResponse(resp);
107+
return ValidateResponse(resp);
97108
}
98109

99110
/// <summary>
@@ -104,24 +115,60 @@ public async Task<bool> OpenBasicCommissioningWindow(SecureSession session, usho
104115
CommissioningTimeout = CommissioningTimeout,
105116
};
106117
InvokeResponseIB resp = await InteractionManager.ExecCommand(session, endPoint, CLUSTER_ID, 0x01, requestFields);
107-
return validateResponse(resp);
118+
return ValidateResponse(resp);
108119
}
109120

110121
/// <summary>
111122
/// Revoke Commissioning
112123
/// </summary>
113124
public async Task<bool> RevokeCommissioning(SecureSession session) {
114125
InvokeResponseIB resp = await InteractionManager.ExecCommand(session, endPoint, CLUSTER_ID, 0x02);
115-
return validateResponse(resp);
126+
return ValidateResponse(resp);
116127
}
117128
#endregion Commands
118129

119130
#region Attributes
120-
public CommissioningWindowStatusEnum WindowStatus { get; }
131+
/// <summary>
132+
/// Features supported by this cluster
133+
/// </summary>
134+
/// <param name="session"></param>
135+
/// <returns></returns>
136+
public async Task<Feature> GetSupportedFeatures(SecureSession session)
137+
{
138+
return (Feature)(byte)(await GetAttribute(session, 0xFFFC))!;
139+
}
121140

122-
public byte AdminFabricIndex { get; }
141+
/// <summary>
142+
/// Returns true when the feature is supported by the cluster
143+
/// </summary>
144+
/// <param name="session"></param>
145+
/// <param name="feature"></param>
146+
/// <returns></returns>
147+
public async Task<bool> Supports(SecureSession session, Feature feature)
148+
{
149+
return ((feature & await GetSupportedFeatures(session)) != 0);
150+
}
123151

124-
public ushort AdminVendorId { get; }
152+
/// <summary>
153+
/// Get the Window Status attribute
154+
/// </summary>
155+
public async Task<CommissioningWindowStatusEnum> GetWindowStatus (SecureSession session) {
156+
return (CommissioningWindowStatusEnum)await GetEnumAttribute(session, 0);
157+
}
158+
159+
/// <summary>
160+
/// Get the Admin Fabric Index attribute
161+
/// </summary>
162+
public async Task<byte?> GetAdminFabricIndex (SecureSession session) {
163+
return (byte?)(dynamic?)await GetAttribute(session, 1, true);
164+
}
165+
166+
/// <summary>
167+
/// Get the Admin Vendor Id attribute
168+
/// </summary>
169+
public async Task<ushort?> GetAdminVendorId (SecureSession session) {
170+
return (ushort?)(dynamic?)await GetAttribute(session, 2, true);
171+
}
125172
#endregion Attributes
126173
}
127174
}

0 commit comments

Comments
 (0)