Avoid generating RPCs for parameters that don't exist
This commit is contained in:
1 parent
b4bbd8f58c
commit
3b987cc0cc
1 file changed
+41
-29
+41
-29
@@ -411,7 +411,7 @@ runDeclarations = (sessionData, declarations) ->
|
|||||||
else
|
else
|
||||||
minInstances = maxInstances = declaration[3]
|
minInstances = maxInstances = declaration[3]
|
||||||
|
|
||||||
parent = path.slice(0, -1)
|
parent = sessionData.deviceData.paths.add(path.slice(0, -1))
|
||||||
|
|
||||||
if Array.isArray(path[path.length - 1])
|
if Array.isArray(path[path.length - 1])
|
||||||
keys = {}
|
keys = {}
|
||||||
@@ -508,6 +508,10 @@ rpcRequest = (sessionData, _declarations, callback) ->
|
|||||||
if not sessionData.syncState?
|
if not sessionData.syncState?
|
||||||
return callback()
|
return callback()
|
||||||
|
|
||||||
|
revision = sessionData.revisions[sessionData.revisions.length - 1] + 1
|
||||||
|
sessionData.deviceData.timestamps.revision = revision
|
||||||
|
sessionData.deviceData.attributes.revision = revision
|
||||||
|
|
||||||
inception = sessionData.declarations.length - 1
|
inception = sessionData.declarations.length - 1
|
||||||
|
|
||||||
provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception])
|
provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception])
|
||||||
@@ -683,32 +687,38 @@ generateGetRpcRequest = (sessionData) ->
|
|||||||
GET_PARAMETER_NAMES_DEPTH_THRESHOLD =
|
GET_PARAMETER_NAMES_DEPTH_THRESHOLD =
|
||||||
config.get('GET_PARAMETER_NAMES_DEPTH_THRESHOLD', sessionData.deviceId)
|
config.get('GET_PARAMETER_NAMES_DEPTH_THRESHOLD', sessionData.deviceId)
|
||||||
|
|
||||||
path = Array.from(syncState.gpn.keys()).sort((a,b) -> a.length - b.length)[0]
|
paths = Array.from(syncState.gpn.keys()).sort((a,b) -> b.length - a.length)
|
||||||
patterns = []
|
path = paths.pop()
|
||||||
iter = sessionData.deviceData.paths.superset(path, 99)
|
while path and not sessionData.deviceData.attributes.has(path)
|
||||||
while p = iter.next().value
|
|
||||||
if v = syncState.gpnPatterns.get(p)
|
|
||||||
patterns.push([p, (v >> path.length) << path.length])
|
|
||||||
|
|
||||||
if path.length >= GET_PARAMETER_NAMES_DEPTH_THRESHOLD
|
|
||||||
est = estimateGpnCount(patterns)
|
|
||||||
else
|
|
||||||
est = 0
|
|
||||||
|
|
||||||
if est < Math.pow(2, Math.max(0, 8 - path.length))
|
|
||||||
nextLevel = true
|
|
||||||
syncState.gpn.delete(path)
|
syncState.gpn.delete(path)
|
||||||
else
|
path = paths.pop()
|
||||||
nextLevel = false
|
|
||||||
iter = sessionData.deviceData.paths.subset(path, 99)
|
|
||||||
while p = iter.next().value
|
|
||||||
syncState.gpn.delete(p)
|
|
||||||
|
|
||||||
return {
|
if path
|
||||||
type: 'GetParameterNames'
|
patterns = []
|
||||||
parameterPath: path.concat('').join('.')
|
iter = sessionData.deviceData.paths.superset(path, 99)
|
||||||
nextLevel: nextLevel
|
while p = iter.next().value
|
||||||
}
|
if v = syncState.gpnPatterns.get(p)
|
||||||
|
patterns.push([p, (v >> path.length) << path.length])
|
||||||
|
|
||||||
|
if path.length >= GET_PARAMETER_NAMES_DEPTH_THRESHOLD
|
||||||
|
est = estimateGpnCount(patterns)
|
||||||
|
else
|
||||||
|
est = 0
|
||||||
|
|
||||||
|
if est < Math.pow(2, Math.max(0, 8 - path.length))
|
||||||
|
nextLevel = true
|
||||||
|
syncState.gpn.delete(path)
|
||||||
|
else
|
||||||
|
nextLevel = false
|
||||||
|
iter = sessionData.deviceData.paths.subset(path, 99)
|
||||||
|
while p = iter.next().value
|
||||||
|
syncState.gpn.delete(p)
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'GetParameterNames'
|
||||||
|
parameterPath: path.concat('').join('.')
|
||||||
|
nextLevel: nextLevel
|
||||||
|
}
|
||||||
|
|
||||||
if syncState.refreshAttributes.value.size
|
if syncState.refreshAttributes.value.size
|
||||||
TASK_PARAMETERS_BATCH_SIZE =
|
TASK_PARAMETERS_BATCH_SIZE =
|
||||||
@@ -718,8 +728,9 @@ generateGetRpcRequest = (sessionData) ->
|
|||||||
iter = syncState.refreshAttributes.value.values()
|
iter = syncState.refreshAttributes.value.values()
|
||||||
while (path = iter.next().value) and
|
while (path = iter.next().value) and
|
||||||
parameterNames.length < TASK_PARAMETERS_BATCH_SIZE
|
parameterNames.length < TASK_PARAMETERS_BATCH_SIZE
|
||||||
parameterNames.push(path)
|
|
||||||
syncState.refreshAttributes.value.delete(path)
|
syncState.refreshAttributes.value.delete(path)
|
||||||
|
if sessionData.deviceData.attributes.has(path)
|
||||||
|
parameterNames.push(path)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
type: 'GetParameterValues'
|
type: 'GetParameterValues'
|
||||||
@@ -736,8 +747,8 @@ generateSetRpcRequest = (sessionData) ->
|
|||||||
# Delete instance
|
# Delete instance
|
||||||
iter = syncState.instancesToDelete.values()
|
iter = syncState.instancesToDelete.values()
|
||||||
while instances = iter.next().value
|
while instances = iter.next().value
|
||||||
if instance = instances.values().next().value
|
if instance = instances.values().next().value and
|
||||||
instances.delete(instance)
|
sessionData.deviceData.attributes.has(instance)
|
||||||
return {
|
return {
|
||||||
type: 'DeleteObject'
|
type: 'DeleteObject'
|
||||||
objectName: instance.concat('').join('.')
|
objectName: instance.concat('').join('.')
|
||||||
@@ -746,7 +757,8 @@ generateSetRpcRequest = (sessionData) ->
|
|||||||
# Create instance
|
# Create instance
|
||||||
iter = syncState.instancesToCreate.entries()
|
iter = syncState.instancesToCreate.entries()
|
||||||
while pair = iter.next().value
|
while pair = iter.next().value
|
||||||
if instance = pair[1].values().next().value
|
if sessionData.deviceData.attributes.has(pair[0]) and
|
||||||
|
instance = pair[1].values().next().value
|
||||||
pair[1].delete(instance)
|
pair[1].delete(instance)
|
||||||
return {
|
return {
|
||||||
type: 'AddObject'
|
type: 'AddObject'
|
||||||
|
|||||||
Reference in new issue
Block a user