Skip to content

Commit 8af71bf

Browse files
authored
Show standard clusters when custom device types are added from custom xml (#1359)
- Adding standalone packages without considering package category - Making sure that invalid session Packages are handled properly - Making sure that sessionPartitionIndex is updated when pacakges are not loaded in the db. Also making sure they are not look into for invalidSessionPkgs since they are already verified for existence - Adding tests to make sure custom device types are being loaded from custom xml - JIRA: ZAPP-1450
1 parent 2b0e752 commit 8af71bf

File tree

6 files changed

+99
-10
lines changed

6 files changed

+99
-10
lines changed

src-electron/generator/template-util.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,12 @@ async function ensureEndpointTypeIds(context) {
290290
deviceType.packageRef
291291
)
292292
// Check for package category match based on gen template category and add it to relevant endpoint types
293-
if (packageInfo.category == packageCategory || !packageCategory) {
293+
if (
294+
packageInfo.category == packageCategory ||
295+
!packageCategory ||
296+
(!packageInfo.category &&
297+
packageInfo.type === dbEnum.packageType.zclXmlStandalone)
298+
) {
294299
resEptIds.push(eptIds[i])
295300
break
296301
}
@@ -327,7 +332,11 @@ async function ensureEndpointTypeIds(context) {
327332
context.global.db,
328333
deviceType.packageRef
329334
)
330-
if (packageInfo.category == packageCategory) {
335+
if (
336+
packageInfo.category == packageCategory ||
337+
(!packageInfo.category &&
338+
packageInfo.type === dbEnum.packageType.zclXmlStandalone)
339+
) {
331340
resEptIds.push(eptIds[i])
332341
break
333342
}

src-electron/importexport/import-json.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,6 +1718,8 @@ async function jsonDataLoader(
17181718
.filter((p) => p.succeeded)
17191719
.map((p) => p.packageId)
17201720

1721+
sessionPartitionIndex += newlyLoadedCustomPackageIds.length
1722+
17211723
let standAlonePackageData = await importPackages(
17221724
db,
17231725
zclXmlStandAlonePackages,
@@ -1795,7 +1797,9 @@ async function jsonDataLoader(
17951797
pkg.type
17961798
)
17971799
let invalidSessionPkgs = sessionPkgs.filter(
1798-
(x) => x.path !== pkgFilePath
1800+
(x) =>
1801+
x.path !== pkgFilePath &&
1802+
!newlyLoadedCustomPackageIds.includes(x.id) // newly added packages are already verified.
17991803
)
18001804
let validSessionPkgId =
18011805
await queryPackage.getPackageIdByPathAndTypeAndVersion(
@@ -1816,12 +1820,14 @@ async function jsonDataLoader(
18161820
env.logDebug(
18171821
`Disabling/removing invalid session package. sessionId(${sessionId}), packageId(${invalidSessionPkgs[i].id}), path(${invalidSessionPkgs[i].path})`
18181822
)
1819-
await queryPackage.deleteSessionPackage(
1820-
db,
1821-
sessionPartitionInfoCurrent[0].sessionPartitionId,
1822-
invalidSessionPkgs[i].id
1823-
)
1824-
sessionPartitionIndex--
1823+
if (sessionPartitionInfoCurrent.length > 0) {
1824+
await queryPackage.deleteSessionPackage(
1825+
db,
1826+
sessionPartitionInfoCurrent[0].sessionPartitionId,
1827+
invalidSessionPkgs[i].id
1828+
)
1829+
sessionPartitionIndex--
1830+
}
18251831
}
18261832

18271833
env.logDebug(

src/store/zap/mutations.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export function updateClusters(state, responseData) {
4747
let packageRefs = []
4848
// Add custom xml packages to the list of packageRefs
4949
let sessionPackages = state.packages
50+
let customXmlPackagesCount = 0
5051
if (sessionPackages && sessionPackages.length > 0) {
5152
for (let i = 0; i < sessionPackages.length; i++) {
5253
if (
@@ -57,15 +58,29 @@ export function updateClusters(state, responseData) {
5758
}
5859
}
5960
}
61+
customXmlPackagesCount = packageRefs.length
6062

6163
if (selectedDeviceTypeRefs) {
6264
for (let i = 0; i < selectedDeviceTypeRefs.length; i++) {
6365
for (let j = 0; j < responseData.deviceTypes.data.length; j++) {
64-
if (selectedDeviceTypeRefs[i] == responseData.deviceTypes.data[j].id) {
66+
if (
67+
selectedDeviceTypeRefs[i] == responseData.deviceTypes.data[j].id &&
68+
!packageRefs.includes(responseData.deviceTypes.data[j].packageRef)
69+
) {
6570
packageRefs.push(responseData.deviceTypes.data[j].packageRef)
6671
}
6772
}
6873
}
74+
// Check if all package refs are standalone(Handles the custom device type use case from xml)
75+
if (customXmlPackagesCount === packageRefs.length) {
76+
// if all packages are custom then add the first standard zcl package to the list of package refs.
77+
for (let i = 0; i < sessionPackages.length; i++) {
78+
if (sessionPackages[i].pkg.type == 'zcl-properties') {
79+
packageRefs.push(sessionPackages[i].pkg.id)
80+
break
81+
}
82+
}
83+
}
6984
} else {
7085
// When endpoint types do not have an associated device type(undefined)
7186
if (responseData.clusterData) {

test/gen-zigbee-7.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const genEngine = require('../src-electron/generator/generation-engine')
2222
const env = require('../src-electron/util/env')
2323
const dbApi = require('../src-electron/db/db-api')
2424
const queryPackage = require('../src-electron/db/query-package')
25+
const queryDeviceType = require('../src-electron/db/query-device-type')
2526
const zclLoader = require('../src-electron/zcl/zcl-loader')
2627
const importJs = require('../src-electron/importexport/import')
2728
const testUtil = require('./test-util')
@@ -119,6 +120,35 @@ test(
119120
expect(pv4).toContain(
120121
'result = emberAfMfglibClusterClusterServerCommandParse(cmd);'
121122
)
123+
124+
// Load a custom xml with device types
125+
result = await zclLoader.loadIndividualFile(
126+
db,
127+
testUtil.testCustomXmlDeviceType,
128+
sessionId
129+
)
130+
if (!result.succeeded) {
131+
console.log(result)
132+
}
133+
expect(result.succeeded).toBeTruthy()
134+
135+
// Check if device type is loaded into the database
136+
let customDeviceType = await queryDeviceType.selectDeviceTypeByCodeAndName(
137+
db,
138+
result.packageId,
139+
0x0002,
140+
'DUT-Server'
141+
)
142+
expect(customDeviceType).not.toBeNull()
143+
expect(customDeviceType.name).toBe('DUT-Server')
144+
145+
// Check device type clusters for device type
146+
let deviceTypeClusters =
147+
await queryDeviceType.selectDeviceTypeClustersByDeviceTypeRef(
148+
db,
149+
customDeviceType.id
150+
)
151+
expect(deviceTypeClusters.length).toBe(2) // 2 device type clusters associated with this device type.
122152
},
123153
testUtil.timeout.long()
124154
)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0"?>
2+
<configurator>
3+
<deviceType>
4+
<name>DUT-Client</name>
5+
<domain>CUSTOM_DUT</domain>
6+
<typeName>D.U.T. Client</typeName>
7+
<zigbeeType>Coordinator</zigbeeType>
8+
<profileId editable="false">0xC001</profileId>
9+
<deviceId editable="false">0x0001</deviceId>
10+
<clusters lockOthers="true">
11+
<include client="true" server="false" clientLocked="true" serverLocked="true" >Test Cluster</include>
12+
<include cluster="Basic" client="true" server="false" clientLocked="true" serverLocked="true"></include>
13+
</clusters>
14+
</deviceType>
15+
<deviceType>
16+
<name>DUT-Server</name>
17+
<domain>CUSTOM_DUT</domain>
18+
<typeName>D.U.T. Server</typeName>
19+
<zigbeeType>End Device</zigbeeType>
20+
<profileId editable="false">0xC001</profileId>
21+
<deviceId editable="false">0x0002</deviceId>
22+
<clusters lockOthers="true">
23+
<include client="false" server="true" clientLocked="true" serverLocked="true" >Test Cluster</include>
24+
<include cluster="Basic" client="false" server="true" clientLocked="true" serverLocked="true"></include>
25+
</clusters>
26+
</deviceType>
27+
</configurator>

test/test-util.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ exports.testServer = testServer
145145

146146
exports.testCustomXml = './test/resource/custom-cluster/test-custom.xml'
147147
exports.testCustomXml2 = './test/resource/custom-cluster/custom-dut.xml'
148+
exports.testCustomXmlDeviceType =
149+
'./test/resource/custom-cluster/custom-device-type.xml'
148150
exports.customClusterXml =
149151
'./test/resource/custom-cluster/custom-bead-cluster.xml'
150152
exports.badTestCustomXml = './test/resource/custom-cluster/bad-test-custom.xml'

0 commit comments

Comments
 (0)