Skip to content

Commit 118bf2e

Browse files
authored
- Using slc args json file when opening .zap files and changing the zcl and templates meta data to use what is in the slc agrs json file during the file open operation (#1657)
- Not saving the .zap file after generation when there is a slc args file beside zap - JIRA: ZAPP-1656
1 parent e77e59a commit 118bf2e

File tree

5 files changed

+210
-13
lines changed

5 files changed

+210
-13
lines changed

docs/api.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16227,12 +16227,27 @@ This module provides the REST API to the session initialization
1622716227

1622816228

1622916229
* [REST API: initialization functions](#module_REST API_ initialization functions)
16230+
* [~ensurePackageLoaded(db, packagePath, packageType)](#module_REST API_ initialization functions..ensurePackageLoaded) ⇒ <code>Promise.&lt;(Object\|null)&gt;</code>
1623016231
* [~sessionAttempt(db)](#module_REST API_ initialization functions..sessionAttempt) ⇒
1623116232
* [~sessionCreate(db)](#module_REST API_ initialization functions..sessionCreate) ⇒
1623216233
* [~initializeSession(db, options:)](#module_REST API_ initialization functions..initializeSession) ⇒
1623316234
* [~loadPreviousSessions(db)](#module_REST API_ initialization functions..loadPreviousSessions) ⇒
1623416235
* [~init(db)](#module_REST API_ initialization functions..init) ⇒
1623516236

16237+
<a name="module_REST API_ initialization functions..ensurePackageLoaded"></a>
16238+
16239+
### REST API: initialization functions~ensurePackageLoaded(db, packagePath, packageType) ⇒ <code>Promise.&lt;(Object\|null)&gt;</code>
16240+
Helper function to check if a package exists in database and load it if not
16241+
16242+
**Kind**: inner method of [<code>REST API: initialization functions</code>](#module_REST API_ initialization functions)
16243+
**Returns**: <code>Promise.&lt;(Object\|null)&gt;</code> - - Package object from database or null if failed
16244+
16245+
| Param | Type | Description |
16246+
| --- | --- | --- |
16247+
| db | <code>\*</code> | Database connection |
16248+
| packagePath | <code>string</code> | Path to the package file |
16249+
| packageType | <code>string</code> | Type of package (zclProperties or genTemplatesJson) |
16250+
1623616251
<a name="module_REST API_ initialization functions..sessionAttempt"></a>
1623716252

1623816253
### REST API: initialization functions~sessionAttempt(db) ⇒
@@ -18041,11 +18056,13 @@ Environment utilities for ZAP
1804118056
* [.setSaveFileFormat(n)](#module_JS API_ Environment utilities.setSaveFileFormat)
1804218057
* [.defaultFileFormat()](#module_JS API_ Environment utilities.defaultFileFormat) ⇒
1804318058
* [.builtinSilabsZclMetafile()](#module_JS API_ Environment utilities.builtinSilabsZclMetafile) ⇒
18059+
* [.builtinSilabsTemplatesMetaFile()](#module_JS API_ Environment utilities.builtinSilabsTemplatesMetaFile) ⇒
1804418060
* [.builtinSilabsZclSpecialMetafile()](#module_JS API_ Environment utilities.builtinSilabsZclSpecialMetafile) ⇒
1804518061
* [.builtinSilabsZclGeneralXmlFile()](#module_JS API_ Environment utilities.builtinSilabsZclGeneralXmlFile) ⇒
1804618062
* [.builtinSilabsSpecialZclGeneralSpecialXmlFile()](#module_JS API_ Environment utilities.builtinSilabsSpecialZclGeneralSpecialXmlFile) ⇒
1804718063
* [.builtinMatterZclMetafile()](#module_JS API_ Environment utilities.builtinMatterZclMetafile) ⇒
1804818064
* [.builtinNewMatterZclMetafile()](#module_JS API_ Environment utilities.builtinNewMatterZclMetafile) ⇒
18065+
* [.builtinMatterTemplatesMetaFile()](#module_JS API_ Environment utilities.builtinMatterTemplatesMetaFile) ⇒
1804918066
* [.builtinDotdotZclMetafile()](#module_JS API_ Environment utilities.builtinDotdotZclMetafile) ⇒
1805018067
* [.builtinMatterZclMetafile2()](#module_JS API_ Environment utilities.builtinMatterZclMetafile2) ⇒
1805118068
* [.builtinTemplateMetafile()](#module_JS API_ Environment utilities.builtinTemplateMetafile) ⇒
@@ -18100,6 +18117,11 @@ Get save file format.
1810018117
### JS API: Environment utilities.builtinSilabsZclMetafile() ⇒
1810118118
**Kind**: static method of [<code>JS API: Environment utilities</code>](#module_JS API_ Environment utilities)
1810218119
**Returns**: path to zcl.json file
18120+
<a name="module_JS API_ Environment utilities.builtinSilabsTemplatesMetaFile"></a>
18121+
18122+
### JS API: Environment utilities.builtinSilabsTemplatesMetaFile() ⇒
18123+
**Kind**: static method of [<code>JS API: Environment utilities</code>](#module_JS API_ Environment utilities)
18124+
**Returns**: path to gen-templates.json file
1810318125
<a name="module_JS API_ Environment utilities.builtinSilabsZclSpecialMetafile"></a>
1810418126

1810518127
### JS API: Environment utilities.builtinSilabsZclSpecialMetafile() ⇒
@@ -18133,6 +18155,11 @@ Get builtin matter ZCL json file
1813318155

1813418156
**Kind**: static method of [<code>JS API: Environment utilities</code>](#module_JS API_ Environment utilities)
1813518157
**Returns**: matter ZCL json file
18158+
<a name="module_JS API_ Environment utilities.builtinMatterTemplatesMetaFile"></a>
18159+
18160+
### JS API: Environment utilities.builtinMatterTemplatesMetaFile() ⇒
18161+
**Kind**: static method of [<code>JS API: Environment utilities</code>](#module_JS API_ Environment utilities)
18162+
**Returns**: path to templates.json file
1813618163
<a name="module_JS API_ Environment utilities.builtinDotdotZclMetafile"></a>
1813718164

1813818165
### JS API: Environment utilities.builtinDotdotZclMetafile() ⇒

src-electron/main-process/startup.js

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -858,20 +858,31 @@ async function generateSingleFile(
858858
}
859859

860860
if (options.upgradeZapFile && isZapFileUpgradeNeeded) {
861-
options.logger(
862-
`🕐 Updating the zap file with the correct SDK meta data: ${zapFile}`
863-
)
864-
// Now we need to write the sessionKey for the file path
865-
await querySession.updateSessionKeyValue(
866-
db,
867-
sessionId,
868-
dbEnum.sessionKey.filePath,
869-
zapFile
870-
)
861+
// Check if slc_args.json exists in the same directory as the zap file
862+
let zapFileDir = path.dirname(zapFile)
863+
let slcArgsFile = path.join(zapFileDir, 'slc_args.json')
864+
let hasSlcArgs = fs.existsSync(slcArgsFile)
865+
866+
if (!hasSlcArgs) {
867+
options.logger(
868+
`🕐 Updating the zap file with the correct SDK meta data: ${zapFile}`
869+
)
870+
// Now we need to write the sessionKey for the file path
871+
await querySession.updateSessionKeyValue(
872+
db,
873+
sessionId,
874+
dbEnum.sessionKey.filePath,
875+
zapFile
876+
)
871877

872-
await exportJs.exportDataIntoFile(db, sessionId, zapFile, {
873-
createBackup: true
874-
})
878+
await exportJs.exportDataIntoFile(db, sessionId, zapFile, {
879+
createBackup: true
880+
})
881+
} else {
882+
options.logger(
883+
`🚫 Skipping zap file update due to presence of slc_args.json: ${zapFile}`
884+
)
885+
}
875886
}
876887

877888
return genResults

src-electron/rest/initialize.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,59 @@ const restApi = require('../../src-shared/rest-api.js')
2828
const util = require('../util/util.js')
2929
const fs = require('fs')
3030
const fsp = fs.promises
31+
const path = require('path')
32+
const zclLoader = require('../zcl/zcl-loader.js')
33+
const genEngine = require('../generator/generation-engine.js')
34+
35+
/**
36+
* Helper function to check if a package exists in database and load it if not
37+
* @param {*} db - Database connection
38+
* @param {string} packagePath - Path to the package file
39+
* @param {string} packageType - Type of package (zclProperties or genTemplatesJson)
40+
* @returns {Promise<Object|null>} - Package object from database or null if failed
41+
*/
42+
async function ensurePackageLoaded(db, packagePath, packageType) {
43+
if (!packagePath) return null
44+
45+
try {
46+
// Check if package already exists in database
47+
let existingPackage = await queryPackage.getPackageByPathAndType(
48+
db,
49+
packagePath,
50+
packageType
51+
)
52+
53+
if (!existingPackage) {
54+
console.log(`Loading package: ${packagePath}`)
55+
56+
if (packageType === dbEnum.packageType.zclProperties) {
57+
// Load ZCL properties package
58+
let packageContext = await zclLoader.loadZcl(db, packagePath)
59+
existingPackage = await queryPackage.getPackageByPackageId(
60+
db,
61+
packageContext.packageId
62+
)
63+
} else if (packageType === dbEnum.packageType.genTemplatesJson) {
64+
// Load template package using generation engine
65+
let templateContext = await genEngine.loadTemplates(db, [packagePath])
66+
if (
67+
templateContext.packageIds &&
68+
templateContext.packageIds.length > 0
69+
) {
70+
existingPackage = await queryPackage.getPackageByPackageId(
71+
db,
72+
templateContext.packageIds[0]
73+
)
74+
}
75+
}
76+
}
77+
78+
return existingPackage
79+
} catch (error) {
80+
env.logWarning(`Failed to load package ${packagePath}: ${error.message}`)
81+
return null
82+
}
83+
}
3184

3285
/**
3386
* This function returns Properties, Templates and Dirty-Sessions
@@ -43,6 +96,16 @@ function sessionAttempt(db) {
4396
let filePathExtension = query.get('zapFileExtensions')
4497
if (filePath) {
4598
if (filePath.includes('.zap')) {
99+
let slcArgsFile = path.join(path.dirname(filePath), 'slc_args.json')
100+
let slcArgs = null
101+
try {
102+
if (fs.existsSync(slcArgsFile)) {
103+
const slcArgsData = await fsp.readFile(slcArgsFile, 'utf8')
104+
slcArgs = JSON.parse(slcArgsData)
105+
}
106+
} catch (error) {
107+
env.logWarning(`Failed to read slc_args.json: ${error.message}`)
108+
}
46109
let data = await fsp.readFile(filePath)
47110
let obj = JSON.parse(data)
48111
let category = []
@@ -53,6 +116,68 @@ function sessionAttempt(db) {
53116
category.push(pkgCategory)
54117
}
55118
})
119+
120+
if (slcArgs) {
121+
let open = true
122+
let zclProperties = []
123+
let zclGenTemplates = []
124+
125+
if (category.includes(`'${dbEnum.helperCategory.zigbee}'`)) {
126+
// Load Zigbee ZCL properties if specified
127+
let zclPackage = await ensurePackageLoaded(
128+
db,
129+
slcArgs[dbEnum.slcArgs.zigbeeZclJsonFile],
130+
dbEnum.packageType.zclProperties
131+
)
132+
if (zclPackage) {
133+
zclProperties.push(zclPackage)
134+
}
135+
136+
// Load Zigbee templates if specified
137+
let templatePackage = await ensurePackageLoaded(
138+
db,
139+
slcArgs[dbEnum.slcArgs.zigbeeTemplateJsonFile],
140+
dbEnum.packageType.genTemplatesJson
141+
)
142+
if (templatePackage) {
143+
zclGenTemplates.push(templatePackage)
144+
}
145+
}
146+
147+
if (category.includes(`'${dbEnum.helperCategory.matter}'`)) {
148+
// Load Matter ZCL properties if specified
149+
let zclPackage = await ensurePackageLoaded(
150+
db,
151+
slcArgs[dbEnum.slcArgs.matterZclJsonFile],
152+
dbEnum.packageType.zclProperties
153+
)
154+
if (zclPackage) {
155+
zclProperties.push(zclPackage)
156+
}
157+
158+
// Load Matter templates if specified
159+
let templatePackage = await ensurePackageLoaded(
160+
db,
161+
slcArgs[dbEnum.slcArgs.matterTemplateJsonFile],
162+
dbEnum.packageType.genTemplatesJson
163+
)
164+
if (templatePackage) {
165+
zclGenTemplates.push(templatePackage)
166+
}
167+
}
168+
169+
const sessions = await querySession.getDirtySessionsWithPackages(db)
170+
return res.send({
171+
zclGenTemplates,
172+
zclProperties,
173+
sessions,
174+
filePath,
175+
zapFilePackages,
176+
open,
177+
filePathExtension
178+
})
179+
}
180+
56181
if (category.length > 0) {
57182
let open = true
58183
const zclProperties = await queryPackage.getPackagesByCategoryAndType(
@@ -251,6 +376,13 @@ function init(db) {
251376
}
252377
}
253378

379+
// Export individual functions for testing
380+
exports.sessionAttempt = sessionAttempt
381+
exports.sessionCreate = sessionCreate
382+
exports.initializeSession = initializeSession
383+
exports.loadPreviousSessions = loadPreviousSessions
384+
exports.init = init
385+
254386
exports.post = [
255387
{
256388
uri: restApi.uri.reloadSession,

src-electron/util/env.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ export function builtinSilabsZclMetafile() {
5454
return locateProjectResource('./zcl-builtin/silabs/zcl.json')
5555
}
5656

57+
/**
58+
*
59+
* @returns path to gen-templates.json file
60+
*/
61+
export function builtinSilabsTemplatesMetaFile() {
62+
return locateProjectResource('./test/gen-template/zigbee/gen-templates.json')
63+
}
64+
5765
/**
5866
* Used to retrieve zcl-special.json by zcl reload test in zcl-loader.test.js
5967
*
@@ -97,6 +105,14 @@ export function builtinNewMatterZclMetafile() {
97105
return locateProjectResource('./zcl-builtin/matter/zcl-new-data-model.json')
98106
}
99107

108+
/**
109+
*
110+
* @returns path to templates.json file
111+
*/
112+
export function builtinMatterTemplatesMetaFile() {
113+
return locateProjectResource('./test/gen-template/matter2/templates.json')
114+
}
115+
100116
/**
101117
* Get builtin dotdot ZCL json file
102118
* @returns dotdot ZCL json file

src-shared/db-enum.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,17 @@ exports.helperCategory = {
212212
meta: 'meta'
213213
}
214214

215+
exports.slcArgs = {
216+
sdkRoot: 'sdkRoot',
217+
apackRoot: 'apackRoot',
218+
partOpn: 'partOpn',
219+
boards: 'boards',
220+
zigbeeZclJsonFile: 'zcl.zigbeeZclJsonFile',
221+
zigbeeTemplateJsonFile: 'zcl.zigbeeTemplateJsonFile',
222+
matterZclJsonFile: 'zcl.matterZclJsonFile',
223+
matterTemplateJsonFile: 'zcl.matterTemplateJsonFile'
224+
}
225+
215226
exports.packageMatch = {
216227
fuzzy: 'fuzzy', // This mechanism will attempt to match the ones from zap file, then give up and do fuzzy match if it fails.
217228
strict: 'strict', // This mechanism will ONLY use the records of packages in the .zap file.

0 commit comments

Comments
 (0)