Skip to content

Commit fbb31a9

Browse files
authored
Adding support for Quality tag in Commands (#1467)
* Added support for qualities in commands * Added isLargeMessage quality * Modified relevant queries and template helpers * Also fixed issues with loading of attribute qualities * Added tests for both command and attribute qualities * updated schema diagram
1 parent 1425198 commit fbb31a9

File tree

14 files changed

+5279
-4720
lines changed

14 files changed

+5279
-4720
lines changed

docs/zap-schema.svg

Lines changed: 2366 additions & 2406 deletions
Loading

src-electron/db/db-mapping.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ exports.map = {
125125
isArray: x.ARRAY_TYPE ? 1 : 0,
126126
mustUseTimedWrite: dbApi.fromDbBool(x.MUST_USE_TIMED_WRITE),
127127
apiMaturity: x.API_MATURITY,
128-
isChangeComitted: dbApi.fromDbBool(x.IS_CHANGE_COMITTED),
128+
isChangeOmitted: dbApi.fromDbBool(x.IS_CHANGE_OMITTED),
129129
persistence: x.PERSISTENCE
130130
}
131131
},
@@ -215,7 +215,8 @@ exports.map = {
215215
hasSpecificResponse: dbApi.toDbBool(x.RESPONSE_REF),
216216
isIncoming: x.INCOMING,
217217
isOutgoing: x.OUTGOING,
218-
isDefaultResponseEnabled: x.IS_DEFAULT_RESPONSE_ENABLED
218+
isDefaultResponseEnabled: x.IS_DEFAULT_RESPONSE_ENABLED,
219+
isLargeMessage: dbApi.fromDbBool(x.IS_LARGE_MESSAGE)
219220
}
220221
},
221222

@@ -686,7 +687,7 @@ exports.map = {
686687
tokenId: x.TOKEN_ID, // Endpoint type attribute's token id
687688
type: x.TYPE != 'array' ? x.TYPE : x.ARRAY_TYPE, // Attribute type
688689
apiMaturity: x.API_MATURITY,
689-
isChangeComitted: x.IS_CHANGE_COMITTED,
690+
isChangeOmitted: dbApi.fromDbBool(x.IS_CHANGE_OMITTED),
690691
persistence: x.PERSISTENCE
691692
}
692693
},

src-electron/db/query-attribute.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ async function selectAllAttributeDetailsFromEnabledClusters(
199199
ENDPOINT_TYPE_ATTRIBUTE.MAX_INTERVAL,
200200
ENDPOINT_TYPE_ATTRIBUTE.REPORTABLE_CHANGE,
201201
ATTRIBUTE.API_MATURITY,
202-
ATTRIBUTE.IS_CHANGE_COMITTED,
202+
ATTRIBUTE.IS_CHANGE_OMITTED,
203203
ATTRIBUTE.PERSISTENCE
204204
FROM ATTRIBUTE
205205
INNER JOIN ENDPOINT_TYPE_ATTRIBUTE
@@ -259,7 +259,7 @@ async function selectAttributeDetailsFromAllEndpointTypesAndClustersUtil(
259259
CLUSTER.NAME AS CLUSTER_NAME,
260260
ENDPOINT_TYPE_CLUSTER.ENABLED,
261261
ATTRIBUTE.API_MATURITY,
262-
ATTRIBUTE.IS_CHANGE_COMITTED,
262+
ATTRIBUTE.IS_CHANGE_OMITTED,
263263
ATTRIBUTE.PERSISTENCE
264264
FROM
265265
ATTRIBUTE
@@ -882,7 +882,7 @@ SELECT
882882
A.ARRAY_TYPE,
883883
A.MUST_USE_TIMED_WRITE,
884884
A.API_MATURITY,
885-
A.IS_CHANGE_COMITTED,
885+
A.IS_CHANGE_OMITTED,
886886
A.PERSISTENCE
887887
FROM ATTRIBUTE AS A
888888
INNER JOIN CLUSTER AS C
@@ -949,7 +949,7 @@ SELECT
949949
A.ARRAY_TYPE,
950950
A.MUST_USE_TIMED_WRITE,
951951
A.API_MATURITY,
952-
A.IS_CHANGE_COMITTED,
952+
A.IS_CHANGE_OMITTED,
953953
A.PERSISTENCE
954954
FROM ATTRIBUTE AS A
955955
WHERE A.PACKAGE_REF IN (${dbApi.toInClause(packageIds)})

src-electron/db/query-command.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,8 @@ async function selectNonGlobalCommandByCode(
964964
C.MUST_USE_TIMED_INVOKE,
965965
C.IS_FABRIC_SCOPED,
966966
C.RESPONSE_REF,
967-
C.RESPONSE_NAME
967+
C.RESPONSE_NAME,
968+
C.IS_LARGE_MESSAGE
968969
FROM COMMAND AS C
969970
INNER JOIN CLUSTER AS CL
970971
ON CL.CLUSTER_ID = C.CLUSTER_REF
@@ -1012,7 +1013,8 @@ async function selectGlobalCommandByCode(
10121013
C.MUST_USE_TIMED_INVOKE,
10131014
C.IS_FABRIC_SCOPED,
10141015
C.RESPONSE_REF,
1015-
C.RESPONSE_NAME
1016+
C.RESPONSE_NAME,
1017+
C.IS_LARGE_MESSAGE
10161018
FROM
10171019
COMMAND AS C
10181020
WHERE
@@ -1089,6 +1091,7 @@ SELECT
10891091
COMMAND.RESPONSE_REF,
10901092
COMMAND.RESPONSE_NAME,
10911093
COMMAND.IS_DEFAULT_RESPONSE_ENABLED,
1094+
COMMAND.IS_LARGE_MESSAGE,
10921095
COUNT(COMMAND_ARG.COMMAND_REF) AS COMMAND_ARGUMENT_COUNT,
10931096
COUNT(COMMAND_ARG.COMMAND_REF) FILTER (WHERE COMMAND_ARG.IS_OPTIONAL = 0) AS REQUIRED_COMMAND_ARGUMENT_COUNT
10941097
FROM COMMAND
@@ -1141,7 +1144,8 @@ async function selectAllCommandsWithArguments(db, packageId) {
11411144
argIsNullable: dbApi.fromDbBool(x.ARG_IS_NULLABLE),
11421145
argCountArg: x.ARG_COUNT_ARG,
11431146
argIntroducedIn: x.INTRODUCED_IN_REF,
1144-
argRemovedIn: x.REMOVED_IN_REF
1147+
argRemovedIn: x.REMOVED_IN_REF,
1148+
isLargeMessage: dbApi.fromDbBool(x.IS_LARGE_MESSAGE)
11451149
}
11461150
}
11471151
let rows = await dbApi.dbAll(
@@ -1160,6 +1164,7 @@ SELECT
11601164
CO.IS_FABRIC_SCOPED,
11611165
CO.RESPONSE_REF,
11621166
CO.RESPONSE_NAME,
1167+
CO.IS_LARGE_MESSAGE,
11631168
CL.NAME AS CLUSTER_NAME,
11641169
CL.CODE AS CLUSTER_CODE,
11651170
CL.MANUFACTURER_CODE AS CLUSTER_MANUFACTURER_CODE,
@@ -1326,6 +1331,7 @@ SELECT
13261331
COMMAND.RESPONSE_REF,
13271332
COMMAND.RESPONSE_NAME,
13281333
COMMAND.IS_DEFAULT_RESPONSE_ENABLED,
1334+
COMMAND.IS_LARGE_MESSAGE,
13291335
COUNT(COMMAND_ARG.COMMAND_REF) AS COMMAND_ARGUMENT_COUNT
13301336
FROM
13311337
COMMAND
@@ -1445,6 +1451,7 @@ SELECT
14451451
COMMAND.RESPONSE_REF,
14461452
COMMAND.RESPONSE_NAME,
14471453
COMMAND.IS_DEFAULT_RESPONSE_ENABLED,
1454+
COMMAND.IS_LARGE_MESSAGE,
14481455
COUNT(COMMAND_ARG.COMMAND_REF) AS COMMAND_ARGUMENT_COUNT
14491456
FROM
14501457
COMMAND
@@ -1619,6 +1626,7 @@ SELECT
16191626
CMD.IS_FABRIC_SCOPED,
16201627
CMD.RESPONSE_REF,
16211628
CMD.RESPONSE_NAME,
1629+
CMD.IS_LARGE_MESSAGE,
16221630
CL.CODE AS CLUSTER_CODE,
16231631
CL.NAME AS CLUSTER_NAME,
16241632
CL.NAME AS CLUSTER_NAME,
@@ -1713,7 +1721,8 @@ function commandMapFunction(x) {
17131721
isClusterEnabled: x.ENABLED,
17141722
commandArgCount: x.COMMAND_ARGUMENT_COUNT,
17151723
responseRef: x.RESPONSE_REF,
1716-
responseName: x.RESPONSE_NAME
1724+
responseName: x.RESPONSE_NAME,
1725+
isLargeMessage: dbApi.fromDbBool(x.IS_LARGE_MESSAGE)
17171726
}
17181727
}
17191728

@@ -1860,6 +1869,7 @@ async function selectCommandDetailsFromAllEndpointTypesAndClusters(
18601869
C.RESPONSE_NAME,
18611870
C.MUST_USE_TIMED_INVOKE,
18621871
C.IS_FABRIC_SCOPED,
1872+
C.IS_LARGE_MESSAGE,
18631873
CASE
18641874
WHEN
18651875
(COUNT(CASE WHEN ETC.IS_INCOMING=1 AND ETC.IS_ENABLED THEN 1 ELSE NULL END) OVER (PARTITION BY C.COMMAND_ID)) >= 1

src-electron/db/query-loader.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,13 @@ INSERT INTO COMMAND (
102102
MANUFACTURER_CODE,
103103
INTRODUCED_IN_REF,
104104
REMOVED_IN_REF,
105-
IS_DEFAULT_RESPONSE_ENABLED
105+
IS_DEFAULT_RESPONSE_ENABLED,
106+
IS_LARGE_MESSAGE
106107
) VALUES (
107108
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
108109
(SELECT SPEC_ID FROM SPEC WHERE CODE = ? AND PACKAGE_REF = ?),
109110
(SELECT SPEC_ID FROM SPEC WHERE CODE = ? AND PACKAGE_REF = ?),
110-
?
111+
?, ?
111112
)`
112113

113114
const INSERT_COMMAND_ARG_QUERY = `
@@ -166,7 +167,7 @@ INSERT OR REPLACE INTO ATTRIBUTE (
166167
INTRODUCED_IN_REF,
167168
REMOVED_IN_REF,
168169
API_MATURITY,
169-
IS_CHANGE_COMITTED,
170+
IS_CHANGE_OMITTED,
170171
PERSISTENCE
171172
) VALUES (
172173
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
@@ -243,7 +244,9 @@ function attributeMap(clusterId, packageId, attributes) {
243244
packageId,
244245
attribute.removedIn,
245246
packageId,
246-
attribute.apiMaturity
247+
attribute.apiMaturity,
248+
dbApi.toDbBool(attribute.isChangeOmitted),
249+
attribute.persistence
247250
])
248251
}
249252

@@ -299,7 +302,8 @@ function commandMap(clusterId, packageId, commands) {
299302
packageId,
300303
command.removedIn,
301304
packageId,
302-
dbApi.toDbBool(command.isDefaultResponseEnabled)
305+
dbApi.toDbBool(command.isDefaultResponseEnabled),
306+
dbApi.toDbBool(command.isLargeMessage)
303307
])
304308
}
305309

@@ -776,7 +780,7 @@ async function insertClusters(db, packageId, data) {
776780
let i
777781
for (i = 0; i < lastIdsArray.length; i++) {
778782
let lastId = lastIdsArray[i]
779-
// NOTE: This code must stay in sync with insertClusterExtensionsx
783+
// NOTE: This code must stay in sync with insertClusterExtensions
780784
if ('commands' in data[i]) {
781785
let cmds = data[i].commands
782786
commands.data.push(...commandMap(lastId, packageId, cmds))

src-electron/db/query-session-zcl.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ SELECT
164164
ATTRIBUTE.IS_SCENE_REQUIRED,
165165
ATTRIBUTE.ARRAY_TYPE,
166166
ATTRIBUTE.MUST_USE_TIMED_WRITE,
167-
ATTRIBUTE.IS_CHANGE_COMITTED,
167+
ATTRIBUTE.IS_CHANGE_OMITTED,
168168
ATTRIBUTE.PERSISTENCE
169169
FROM
170170
ATTRIBUTE, CLUSTER, SESSION_PACKAGE
@@ -216,7 +216,8 @@ SELECT
216216
CMD.IS_OPTIONAL,
217217
CMD.MUST_USE_TIMED_INVOKE,
218218
CMD.IS_FABRIC_SCOPED,
219-
CMD.RESPONSE_REF
219+
CMD.RESPONSE_REF,
220+
CMD.IS_LARGE_MESSAGE
220221
FROM
221222
COMMAND AS CMD
222223
INNER JOIN

src-electron/db/query-zcl.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ SELECT
713713
MUST_USE_TIMED_WRITE,
714714
API_MATURITY,
715715
PACKAGE_REF,
716-
IS_CHANGE_COMITTED,
716+
IS_CHANGE_OMITTED,
717717
PERSISTENCE
718718
FROM ATTRIBUTE
719719
WHERE (CLUSTER_REF = ? OR CLUSTER_REF IS NULL)
@@ -770,7 +770,7 @@ SELECT
770770
ARRAY_TYPE,
771771
MUST_USE_TIMED_WRITE,
772772
API_MATURITY,
773-
IS_CHANGE_COMITTED,
773+
IS_CHANGE_OMITTED,
774774
PERSISTENCE
775775
FROM ATTRIBUTE
776776
WHERE
@@ -837,7 +837,7 @@ SELECT
837837
A.ARRAY_TYPE,
838838
A.MUST_USE_TIMED_WRITE,
839839
A.API_MATURITY,
840-
A.IS_CHANGE_COMITTED,
840+
A.IS_CHANGE_OMITTED,
841841
A.PERSISTENCE
842842
FROM
843843
ATTRIBUTE AS A,
@@ -891,7 +891,7 @@ SELECT
891891
ARRAY_TYPE,
892892
MUST_USE_TIMED_WRITE,
893893
API_MATURITY,
894-
IS_CHANGE_COMITTED,
894+
IS_CHANGE_OMITTED,
895895
PERSISTENCE
896896
FROM ATTRIBUTE
897897
WHERE ATTRIBUTE_ID = ?`,
@@ -958,7 +958,7 @@ SELECT
958958
A.ARRAY_TYPE,
959959
A.MUST_USE_TIMED_WRITE,
960960
A.API_MATURITY,
961-
A.IS_CHANGE_COMITTED,
961+
A.IS_CHANGE_OMITTED,
962962
A.PERSISTENCE
963963
FROM ATTRIBUTE AS A
964964
WHERE ATTRIBUTE_ID = ?`,
@@ -1007,7 +1007,7 @@ SELECT
10071007
A.MUST_USE_TIMED_WRITE,
10081008
A.API_MATURITY,
10091009
C.CODE AS CLUSTER_CODE,
1010-
A.IS_CHANGE_COMITTED,
1010+
A.IS_CHANGE_OMITTED,
10111011
A.PERSISTENCE
10121012
FROM
10131013
ATTRIBUTE AS A
@@ -1063,7 +1063,7 @@ SELECT
10631063
ARRAY_TYPE,
10641064
MUST_USE_TIMED_WRITE,
10651065
API_MATURITY,
1066-
IS_CHANGE_COMITTED,
1066+
IS_CHANGE_OMITTED,
10671067
PERSISTENCE
10681068
FROM ATTRIBUTE
10691069
WHERE SIDE = ?

src-electron/db/zap-schema.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ CREATE TABLE IF NOT EXISTS "COMMAND" (
182182
"RESPONSE_NAME" integer,
183183
"RESPONSE_REF" integer,
184184
"IS_DEFAULT_RESPONSE_ENABLED" integer,
185+
"IS_LARGE_MESSAGE" integer,
185186
foreign key (INTRODUCED_IN_REF) references SPEC(SPEC_ID) ON DELETE CASCADE ON UPDATE CASCADE,
186187
foreign key (REMOVED_IN_REF) references SPEC(SPEC_ID) ON DELETE CASCADE ON UPDATE CASCADE,
187188
foreign key (CLUSTER_REF) references CLUSTER(CLUSTER_ID) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -291,7 +292,7 @@ CREATE TABLE IF NOT EXISTS "ATTRIBUTE" (
291292
"INTRODUCED_IN_REF" integer,
292293
"REMOVED_IN_REF" integer,
293294
"API_MATURITY" text,
294-
"IS_CHANGE_COMITTED" integer,
295+
"IS_CHANGE_OMITTED" integer,
295296
"PERSISTENCE" text,
296297
foreign key (INTRODUCED_IN_REF) references SPEC(SPEC_ID) ON DELETE CASCADE ON UPDATE CASCADE,
297298
foreign key (REMOVED_IN_REF) references SPEC(SPEC_ID) ON DELETE CASCADE ON UPDATE CASCADE,

src-electron/zcl/zcl-loader-silabs.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,10 @@ function prepareCluster(cluster, context, isExtension = false) {
457457
if ('command' in cluster) {
458458
ret.commands = []
459459
cluster.command.forEach((command) => {
460+
let quality = null
461+
if ('quality' in command) {
462+
quality = command.quality[0].$
463+
}
460464
let cmd = {
461465
code: parseInt(command.$.code),
462466
manufacturerCode: command.$.manufacturerCode,
@@ -470,7 +474,8 @@ function prepareCluster(cluster, context, isExtension = false) {
470474
responseName: command.$.response == null ? null : command.$.response,
471475
isDefaultResponseEnabled:
472476
command.$.disableDefaultResponse == 'true' ? false : true,
473-
isFabricScoped: command.$.isFabricScoped == 'true'
477+
isFabricScoped: command.$.isFabricScoped == 'true',
478+
isLargeMessage: quality ? quality.largeMessage == 'true' : false
474479
}
475480
cmd.access = extractAccessIntoArray(command)
476481
if (cmd.manufacturerCode == null) {
@@ -639,7 +644,7 @@ function prepareCluster(cluster, context, isExtension = false) {
639644
entryType: attribute.$.entryType,
640645
mustUseTimedWrite: attribute.$.mustUseTimedWrite == 'true',
641646
apiMaturity: attribute.$.apiMaturity,
642-
changeOmitted: quality ? quality.changeOmitted == 'true' : false,
647+
isChangeOmitted: quality ? quality.changeOmitted == 'true' : false,
643648
persistence: quality ? quality.persistence : null
644649
}
645650
att.access = extractAccessIntoArray(attribute)

test/gen-matter-1.test.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,17 @@ test(
205205
'0,UINT0_MAX// actual type: ThermostatScheduleTransition'
206206
)
207207

208-
// Testing attribute's scene loading
208+
// Testing attribute qualities loading
209209
expect(
210210
sdkExt.includes(
211-
"// attribute: 0x0300 / 0x4001 => EnhancedColorMode, extensions: '', '', scene: true"
211+
"// attribute: 0x0300 / 0x4001 => EnhancedColorMode, extensions: '', '', scene: true, isChangeOmitted: true, persistence: nonVolatile"
212+
)
213+
)
214+
215+
// Testing isLargeMessage quality for commands
216+
expect(
217+
sdkExt.includes(
218+
"// command: 0x0300 / 0x00 => MoveToHue, test extension: '', isLargeMessage: true"
212219
)
213220
)
214221
},

0 commit comments

Comments
 (0)