Skip to content

Commit e479e28

Browse files
authored
cleanup Matter SDK code (#1212)
* get list from db instead of zcl.json
1 parent f711dcb commit e479e28

File tree

11 files changed

+140
-104
lines changed

11 files changed

+140
-104
lines changed

src-electron/db/query-config.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const dbMapping = require('./db-mapping.js')
2525
const queryPackage = require('./query-package.js')
2626
const dbEnum = require('../../src-shared/db-enum.js')
2727
const queryZcl = require('./query-zcl.js')
28-
const queryUpgrade = require('../matter/matter.js')
28+
const queryUpgrade = require('../sdk/matter.js')
2929
const queryDeviceType = require('./query-device-type')
3030
const querySession = require('./query-session')
3131
const queryCommand = require('./query-command.js')
@@ -213,16 +213,17 @@ async function insertOrUpdateAttributeState(
213213
attributeId,
214214
clusterRef
215215
)
216-
let forcedExternal = await queryUpgrade.getForcedExternalStorage(
217-
db,
218-
attributeId
219-
)
220-
let storageOption = await queryUpgrade.computeStorageNewConfig(
221-
db,
222-
clusterRef,
223-
staticAttribute.storagePolicy,
224-
forcedExternal,
225-
staticAttribute.name
216+
let forcedExternal = await queryUpgrade.getForcedExternalStorage(db)
217+
staticAttribute.storagePolicy =
218+
await queryUpgrade.computeStoragePolicyNewConfig(
219+
db,
220+
clusterRef,
221+
staticAttribute.storagePolicy,
222+
forcedExternal,
223+
staticAttribute.name
224+
)
225+
let storageOption = await queryUpgrade.computeStorageOptionNewConfig(
226+
staticAttribute.storagePolicy
226227
)
227228
if (
228229
staticAttribute.storagePolicy ==

src-electron/db/query-impexp.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
const dbApi = require('./db-api')
2424
const dbEnums = require('../../src-shared/db-enum')
2525
const dbMapping = require('./db-mapping.js')
26-
const queryUpgrade = require('../matter/matter.js')
27-
const queryDeviceType = require('./query-device-type')
26+
const queryUpgrade = require('../sdk/matter.js')
2827
/**
2928
* Imports a single endpoint
3029
* @param {} db
@@ -739,10 +738,7 @@ WHERE
739738
attribute.reportable = false
740739
}
741740
if (attributeId) {
742-
forcedExternal = await queryUpgrade.getForcedExternalStorage(
743-
db,
744-
attributeId
745-
)
741+
forcedExternal = await queryUpgrade.getForcedExternalStorage(db)
746742
storagePolicy = await queryUpgrade.computeStorageImport(
747743
db,
748744
cluster.name,

src-electron/db/query-package.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,24 @@ async function getAllPackages(db) {
637637
.then((rows) => rows.map(dbMapping.map.package))
638638
}
639639

640+
async function getAttributeAccessInterface(db, code) {
641+
return dbApi
642+
.dbAll(
643+
db,
644+
`SELECT
645+
PACKAGE_REF,
646+
OPTION_CATEGORY,
647+
OPTION_CODE,
648+
OPTION_LABEL
649+
FROM
650+
PACKAGE_OPTION
651+
WHERE
652+
OPTION_CODE = ?`,
653+
[code]
654+
)
655+
.then((rows) => rows.map(dbMapping.map.options))
656+
}
657+
640658
/**
641659
* This async function inserts an option and its values into the DB.
642660
*
@@ -658,7 +676,7 @@ async function insertOptionsKeyValues(
658676
VALUES
659677
(?, ?, ?, ?)
660678
ON CONFLICT
661-
(PACKAGE_REF, OPTION_CATEGORY, OPTION_CODE)
679+
(PACKAGE_REF, OPTION_CATEGORY, OPTION_CODE, OPTION_LABEL)
662680
DO NOTHING`,
663681
optionCodeLabels.map((optionValue) => {
664682
return [packageId, optionCategory, optionValue.code, optionValue.label]
@@ -1037,6 +1055,7 @@ async function insertSessionKeyValuesFromPackageDefaults(db, sessionId) {
10371055
}
10381056

10391057
// exports
1058+
exports.getAttributeAccessInterface = getAttributeAccessInterface
10401059
exports.getPackageRefByAttributeId = getPackageRefByAttributeId
10411060
exports.getPackageByPathAndParent = getPackageByPathAndParent
10421061
exports.getPackageByPackageId = getPackageByPackageId

src-electron/db/zap-schema.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ CREATE TABLE "PACKAGE_OPTION" (
4949
"OPTION_CODE" text,
5050
"OPTION_LABEL" text,
5151
foreign key (PACKAGE_REF) references PACKAGE(PACKAGE_ID) on delete cascade,
52-
UNIQUE(PACKAGE_REF, OPTION_CATEGORY, OPTION_CODE)
52+
UNIQUE(PACKAGE_REF, OPTION_CATEGORY, OPTION_CODE, OPTION_LABEL)
5353
);
5454
/*
5555
PACKAGE_OPTION_DEFAULT table contains a link to a specified 'default value' for options

src-electron/generator/generation-engine.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ async function recordTemplatesPackage(context) {
127127
context.templateData.category,
128128
context.templateData.description
129129
)
130-
131130
context.packageId = topLevel.id
132131
if (topLevel.existedPreviously) return context
133132

src-electron/generator/helper-zcl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const helperC = require('./helper-c')
2525
const env = require('../util/env')
2626
const types = require('../util/types')
2727
const zclUtil = require('../util/zcl-util')
28-
const upgrade = require('../matter/matter.js')
28+
const upgrade = require('../sdk/matter.js')
2929
const _ = require('lodash')
3030

3131
const characterStringTypes = ['CHAR_STRING', 'LONG_CHAR_STRING']

src-electron/rest/user-data.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const queryZcl = require('../db/query-zcl.js')
2525
const queryAttribute = require('../db/query-attribute.js')
2626
const queryCommand = require('../db/query-command.js')
2727
const queryConfig = require('../db/query-config.js')
28-
const upgrade = require('../matter/matter.js')
28+
const upgrade = require('../sdk/matter.js')
2929
const querySessionNotification = require('../db/query-session-notification.js')
3030
const queryPackageNotification = require('../db/query-package-notification')
3131
const queryEndpointType = require('../db/query-endpoint-type.js')
@@ -257,9 +257,8 @@ function httpPostCluster(db) {
257257
}
258258
function httpPostForcedExternal(db) {
259259
return async (request, response) => {
260-
let zcl = request.body[0].pkg.path
261-
let forcedExternal = await upgrade.getDisabledStorage(db, zcl)
262-
return response.send({ forcedExternal })
260+
let forcedExternal = await upgrade.getForcedExternalStorage(db)
261+
response.status(StatusCodes.OK).json(forcedExternal)
263262
}
264263
}
265264
/**

src-electron/matter/matter.js renamed to src-electron/sdk/matter.js

Lines changed: 53 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,11 @@ const dbEnum = require('../../src-shared/db-enum.js')
2323
const fs = require('fs')
2424
const fsp = fs.promises
2525

26-
function parseJson(json) {
27-
try {
28-
return JSON.parse(json)
29-
} catch (err) {
30-
return undefined
31-
}
32-
}
33-
3426
/**
35-
* This file implements upgrade rules which are used to upgrade .zap files and xml files
36-
* to be in sync with the spec
27+
* This file implements SDK rules which are used to upgrade .zap files and xml files
28+
* to be in sync with the Matter SDK and spec
3729
*/
38-
async function getForcedExternalStorageList(db, zcl) {
39-
let obj = await fsp.readFile(zcl, 'utf-8')
40-
let data = parseJson(obj)
41-
let byName = data?.attributeAccessInterfaceAttributes
42-
let lists = data?.listsUseAttributeAccessInterface
43-
let forcedExternal = { byName, lists }
44-
return forcedExternal
45-
}
30+
4631
/**
4732
* Returns an array of objects containing global attributes that should be forced external.
4833
*
@@ -52,15 +37,11 @@ async function getForcedExternalStorageList(db, zcl) {
5237
* @returns An array of objects
5338
*/
5439

55-
async function getForcedExternalStorage(db, attributeId) {
56-
let pkgs = await queryPackage.getPackageRefByAttributeId(db, attributeId)
57-
let zcl = await queryPackage.getPackageByPackageId(db, pkgs)
58-
zcl = zcl?.path
59-
let obj = await fsp.readFile(zcl, 'utf-8')
60-
let data = parseJson(obj)
61-
let byName = data?.attributeAccessInterfaceAttributes
62-
let lists = data?.listsUseAttributeAccessInterface
63-
let forcedExternal = { byName, lists }
40+
async function getForcedExternalStorage(db) {
41+
let forcedExternal = await queryPackage.getAttributeAccessInterface(
42+
db,
43+
dbEnum.storagePolicy.attributeAccessInterface
44+
)
6445
return forcedExternal
6546
}
6647

@@ -85,26 +66,26 @@ async function computeStoragePolicyForGlobalAttributes(
8566
clusterId,
8667
attributes
8768
) {
88-
let clusterName
8969
let forcedExternal
90-
clusterName = await queryCluster.selectClusterName(db, clusterId)
70+
let clusterName = await queryCluster.selectClusterName(db, clusterId)
9171
return Promise.all(
9272
attributes.map(async (attribute) => {
9373
if (attribute.clusterId == null) {
9474
forcedExternal = await getForcedExternalStorage(db, attribute.id)
95-
if (forcedExternal.byName?.[clusterName]?.includes(attribute.name)) {
96-
attribute.storagePolicy =
97-
dbEnum.storagePolicy.attributeAccessInterface
98-
}
75+
forcedExternal.map((option) => {
76+
if (
77+
option.optionCategory == clusterName &&
78+
option.optionLabel == attribute.name
79+
) {
80+
attribute.storagePolicy =
81+
dbEnum.storagePolicy.attributeAccessInterface
82+
}
83+
})
9984
}
10085
return attribute
10186
})
10287
)
10388
}
104-
async function getDisabledStorage(db, zcl) {
105-
return await getForcedExternalStorageList(db, zcl)
106-
}
107-
10889
/**
10990
* Returns a flag stating which type of storage option the attribute is categorized to be.
11091
*
@@ -118,33 +99,38 @@ async function getDisabledStorage(db, zcl) {
11899
* @returns Storage Option
119100
*/
120101

121-
async function computeStorageNewConfig(
122-
db,
123-
clusterRef,
124-
storagePolicy,
125-
forcedExternal,
126-
attributeName
127-
) {
102+
async function computeStorageOptionNewConfig(storagePolicy) {
128103
let storageOption
129-
let clusterName
130-
clusterName = await queryCluster.selectClusterName(db, clusterRef)
131104
if (storagePolicy == dbEnum.storagePolicy.attributeAccessInterface) {
132105
storageOption = dbEnum.storageOption.external
133106
} else if (storagePolicy == dbEnum.storagePolicy.any) {
134107
storageOption = dbEnum.storageOption.ram
135108
} else {
136109
throw 'check storage policy'
137110
}
138-
if (
139-
forcedExternal.byName &&
140-
forcedExternal.byName[clusterName] &&
141-
forcedExternal.byName[clusterName].includes(attributeName)
142-
) {
143-
storageOption = dbEnum.storageOption.external
144-
}
145111
return storageOption
146112
}
147113

114+
async function computeStoragePolicyNewConfig(
115+
db,
116+
clusterRef,
117+
storagePolicy,
118+
forcedExternal,
119+
attributeName
120+
) {
121+
let clusterName
122+
clusterName = await queryCluster.selectClusterName(db, clusterRef)
123+
forcedExternal.map((option) => {
124+
if (
125+
option.optionCategory == clusterName &&
126+
option.optionLabel == attributeName
127+
) {
128+
storagePolicy = dbEnum.storagePolicy.attributeAccessInterface
129+
}
130+
})
131+
return storagePolicy
132+
}
133+
148134
/**
149135
* Returns a flag stating which type of storage option the attribute is categorized to be.
150136
*
@@ -163,19 +149,23 @@ async function computeStorageImport(
163149
forcedExternal,
164150
attributeName
165151
) {
166-
if (
167-
forcedExternal.byName &&
168-
forcedExternal.byName[clusterName] &&
169-
forcedExternal.byName[clusterName].includes(attributeName)
170-
) {
171-
storagePolicy = dbEnum.storagePolicy.attributeAccessInterface
172-
}
173-
return storagePolicy
152+
let updatedStoragePolicy = storagePolicy
153+
forcedExternal.some((option) => {
154+
if (
155+
option.optionCategory == clusterName &&
156+
option.optionLabel == attributeName
157+
) {
158+
updatedStoragePolicy = dbEnum.storagePolicy.attributeAccessInterface
159+
return true
160+
}
161+
return false
162+
})
163+
return updatedStoragePolicy
174164
}
175165

176166
exports.getForcedExternalStorage = getForcedExternalStorage
177-
exports.getDisabledStorage = getDisabledStorage
178167
exports.computeStorageImport = computeStorageImport
179-
exports.computeStorageNewConfig = computeStorageNewConfig
168+
exports.computeStoragePolicyNewConfig = computeStoragePolicyNewConfig
169+
exports.computeStorageOptionNewConfig = computeStorageOptionNewConfig
180170
exports.computeStoragePolicyForGlobalAttributes =
181171
computeStoragePolicyForGlobalAttributes

src-electron/util/env.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ export function isMatchingVersion(versionsArray, providedVersion) {
444444
*/
445445
export function versionsCheck() {
446446
let expectedNodeVersion = ['v14.x.x', 'v16.x.x', 'v18.x.x']
447-
let expectedElectronVersion = ['17.4.x', '18.x.x', '24.x.x']
447+
let expectedElectronVersion = ['17.4.x', '18.x.x', '24.x.x', '27.x.x']
448448
let nodeVersion = process.version
449449
let electronVersion = process.versions.electron
450450
let ret = true

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,6 +2087,35 @@ async function parseBoolOptions(db, pkgRef, booleanCategories) {
20872087
return Promise.all(promises)
20882088
}
20892089

2090+
/**
2091+
* Parses the attributeAccessInterfaceAttributes values inside the options.
2092+
*
2093+
* @param {*} db
2094+
* @param {*} ctx
2095+
* @returns Promised of parsed attributeAccessInterfaceAttributes.
2096+
*/
2097+
2098+
async function parseattributeAccessInterfaceAttributes(
2099+
db,
2100+
pkgRef,
2101+
attributeAccessInterfaceAttributes
2102+
) {
2103+
Object.keys(attributeAccessInterfaceAttributes).map((cluster) => {
2104+
let val = attributeAccessInterfaceAttributes[cluster]
2105+
return queryPackage.insertOptionsKeyValues(
2106+
db,
2107+
pkgRef,
2108+
cluster,
2109+
val.map((optionValue) => {
2110+
return {
2111+
code: dbEnum.storagePolicy.attributeAccessInterface,
2112+
label: optionValue,
2113+
}
2114+
})
2115+
)
2116+
})
2117+
}
2118+
20902119
/**
20912120
* Parses the default values inside the options.
20922121
*
@@ -2401,6 +2430,13 @@ async function loadZclJsonOrProperties(db, metafile, isJson = false) {
24012430
if (ctx.defaults) {
24022431
await parseDefaults(db, ctx.packageId, ctx.defaults)
24032432
}
2433+
if (ctx.attributeAccessInterfaceAttributes) {
2434+
await parseattributeAccessInterfaceAttributes(
2435+
db,
2436+
ctx.packageId,
2437+
ctx.attributeAccessInterfaceAttributes
2438+
)
2439+
}
24042440
if (ctx.featureFlags) {
24052441
await parseFeatureFlags(db, ctx.packageId, ctx.featureFlags)
24062442
}

0 commit comments

Comments
 (0)