Skip to content

Commit

Permalink
refactor extractConditionFields
Browse files Browse the repository at this point in the history
  • Loading branch information
erossignon committed Jul 15, 2023
1 parent 3086de3 commit 8571c54
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 120 deletions.
Expand Up @@ -27,7 +27,7 @@ function r(_key: string, o: { dataType?: unknown; value?: unknown }) {
interface ClientSessionPriv extends ClientSession {
$clientAlarmList: ClientAlarmList | null;
$monitoredItemForAlarmList: ClientMonitoredItem | null;
$subscriptionforAlarmList: ClientSubscription | null;
$subscriptionForAlarmList: ClientSubscription | null;
}
// ------------------------------------------------------------------------------------------------------------------------------
export async function uninstallAlarmMonitoring(session: ClientSession): Promise<void> {
Expand All @@ -40,7 +40,7 @@ export async function uninstallAlarmMonitoring(session: ClientSession): Promise<
mi.removeAllListeners();

_sessionPriv.$monitoredItemForAlarmList = null;
await _sessionPriv.$subscriptionforAlarmList!.terminate();
await _sessionPriv.$subscriptionForAlarmList!.terminate();
_sessionPriv.$clientAlarmList = null;
return;
}
Expand Down Expand Up @@ -76,7 +76,7 @@ export async function installAlarmMonitoring(session: ClientSession): Promise<Cl
requestedPublishingInterval: 500
};
const subscription = await session.createSubscription2(request);
_sessionPriv.$subscriptionforAlarmList = subscription;
_sessionPriv.$subscriptionForAlarmList = subscription;

const itemToMonitor: ReadValueIdOptions = {
attributeId: AttributeIds.EventNotifier,
Expand Down
Expand Up @@ -168,7 +168,7 @@ export async function confirmAllConditions(session: ClientSession, message: stri
debugLog("Warning: cannot find conditions ");
}

// filter acknowledgable conditions (no acked yet)
// filter acknowledgeable conditions (no acked yet)
conditions = conditions.filter((pojo) => pojo.confirmedState.id.value === false);

const promises: Array<Promise<any>> = [];
Expand Down
@@ -1,119 +1,12 @@
import { BrowseDirection, NodeClassMask, QualifiedName } from "node-opcua-data-model";
import { NodeId, NodeIdLike, resolveNodeId } from "node-opcua-nodeid";
import { IBasicSession } from "node-opcua-pseudo-session";
import { BrowseDescriptionOptions } from "node-opcua-service-browse";
import { NodeClass } from "node-opcua-types";
import { NodeIdLike } from "node-opcua-nodeid";
import { IBasicSession, simpleBrowsePathsToString, extractFields } from "node-opcua-pseudo-session";

export async function extractConditionFields(session: IBasicSession, conditionNodeId: NodeIdLike): Promise<string[]> {
// conditionNodeId could be a Object of type ConditionType
// or it could be directly a ObjectType which is a subType of ConditionType

const _duplicateMap: any = {};
const fields1: string[] = [];

function addField(name: string) {
if (!_duplicateMap[name]) {
fields1.push(name);
_duplicateMap[name] = name;
}
}
interface S {
browseName: QualifiedName;
nodeToBrowse: BrowseDescriptionOptions;
}
const stack: any[] = [];
function deferObjectOrVariableInvestigation(objectId: NodeId, browseName: string) {
stack.push({
browseName,
nodeId: objectId
});
}
async function _investigateObjectOrVariable() {
if (stack.length === 0) {
return;
}

const extracted = stack.splice(0);
const nodesToBrowse = extracted.map((e: any) => {
const b: BrowseDescriptionOptions = {
browseDirection: BrowseDirection.Forward,
includeSubtypes: true,
// tslint:disable-next-line: no-bitwise
nodeClassMask: NodeClassMask.Object | NodeClassMask.Variable,
nodeId: e.nodeId,
referenceTypeId: "HasChild",
resultMask: 63
};
return b;
});
const results = await session.browse(nodesToBrowse);

let i = 0;
for (const result of results) {
const name = extracted[i].browseName.toString();
i++;

if (!result.references) {
continue;
}

for (const ref of result.references) {
const n = name + "." + ref.browseName.toString();
if (ref.nodeClass === NodeClass.Variable) {
addField(n);
}
deferObjectOrVariableInvestigation(ref.nodeId, n);
}
}
await _investigateObjectOrVariable();
}

// tslint:disable-next-line: no-shadowed-variable
async function _investigateLevel(conditionNodeId: NodeIdLike) {
const nodeToBrowse1: BrowseDescriptionOptions = {
browseDirection: BrowseDirection.Inverse,
includeSubtypes: true,
nodeClassMask: NodeClassMask.ObjectType,
nodeId: conditionNodeId,
referenceTypeId: resolveNodeId("HasSubtype"),
resultMask: 63
};
const nodeToBrowse2: BrowseDescriptionOptions = {
browseDirection: BrowseDirection.Forward,
includeSubtypes: true,

// tslint:disable-next-line: no-bitwise
nodeClassMask: NodeClassMask.Object | NodeClassMask.Variable,

nodeId: conditionNodeId,
referenceTypeId: resolveNodeId("HasChild"),
resultMask: 63
};
const nodesToBrowse = [nodeToBrowse1, nodeToBrowse2];
const browseResults = await session.browse(nodesToBrowse);

if (browseResults[1] && browseResults[1].references) {
for (const ref of browseResults[1].references) {
if (ref.nodeClass === NodeClass.Variable) {
addField(ref.browseName.toString());
}
deferObjectOrVariableInvestigation(ref.nodeId, ref.browseName.toString());
}
}
if (browseResults[0] && browseResults[0].references) {
const promises = [];
for (const reference of browseResults[0].references) {
promises.push(_investigateLevel(reference.nodeId));
}
await Promise.all(promises);
}

await _investigateObjectOrVariable();
}
await _investigateLevel(conditionNodeId);

const p = await extractFields(session, conditionNodeId);
const fields1 = simpleBrowsePathsToString(p.map((a) => a.path));
// add this field which will always be added
addField("ConditionId");

fields1.push("ConditionId");
return fields1;
}
18 changes: 14 additions & 4 deletions packages/node-opcua-client/test/test_extractConditionFields.ts
@@ -1,13 +1,23 @@
import * as fs from "fs";
import "should";
import fs from "fs";
import should from "should";
import { AddressSpace } from "node-opcua-address-space";
import { construct_demo_alarm_in_address_space, IAlarmTestData } from "node-opcua-address-space/testHelpers";
import { generateAddressSpace } from "node-opcua-address-space/nodeJS";
import { PseudoSession } from "node-opcua-address-space";
import { nodesets } from "node-opcua-nodesets";
import { checkDebugFlag, make_debugLog } from "node-opcua-debug";

import { AttributeIds, constructEventFilter, DataType, extractConditionFields, fieldsToJson, resolveNodeId, Variant } from "..";
import {
AttributeIds,
constructEventFilter,
DataType,
extractConditionFields,
extractEventFieldsSimplePath,
fieldsToJson,
resolveNodeId,
simpleBrowsePathsToString,
Variant
} from "..";

const debugLog = make_debugLog("TEST");
const doDebug = checkDebugFlag("TEST");
Expand All @@ -16,7 +26,7 @@ describe("extractConditionFields", () => {
let addressSpace: AddressSpace;
const test = {} as IAlarmTestData;
before(async () => {
const xmlFiles = [nodesets.standard];
const xmlFiles = [nodesets.standard, nodesets.di, nodesets.autoId];
addressSpace = AddressSpace.create();
fs.existsSync(xmlFiles[0]).should.eql(true);
await generateAddressSpace(addressSpace, xmlFiles);
Expand Down

0 comments on commit 8571c54

Please sign in to comment.