mirror of
https://github.com/open62541/open62541.git
synced 2026-10-19 14:22:58 +08:00
f99c02891e
Add global and type-specific lifecycle callbacks that run after defining references are installed but before mandatory children are instantiated. This lets applications precreate or customize children consistently for direct, namespace-zero and recursively instantiated nodes.
111 lines
4.9 KiB
C
111 lines
4.9 KiB
C
#ifndef OPEN62541_MT_COMMON
|
|
#define OPEN62541_MT_COMMON
|
|
|
|
#include "mt_testing.h"
|
|
|
|
UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
|
|
|
|
static void
|
|
defineObjectTypes(void) {
|
|
UA_NodeId deviceTypeId;
|
|
UA_ObjectTypeAttributes dtAttr = UA_ObjectTypeAttributes_default;
|
|
dtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DeviceType");
|
|
UA_Server_addObjectTypeNode(tc.server, UA_NODEID_NULL,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
|
UA_QUALIFIEDNAME(1, "DeviceType"), dtAttr,
|
|
NULL, &deviceTypeId);
|
|
|
|
UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
|
|
mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
|
|
UA_NodeId manufacturerNameId;
|
|
UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, deviceTypeId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
UA_QUALIFIEDNAME(1, "ManufacturerName"),
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), mnAttr, NULL, &manufacturerNameId);
|
|
|
|
UA_Server_addReference(tc.server, manufacturerNameId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
|
|
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
|
|
|
|
|
|
UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
|
|
modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
|
|
UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, deviceTypeId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
UA_QUALIFIEDNAME(1, "ModelName"),
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), modelAttr, NULL, NULL);
|
|
|
|
UA_ObjectTypeAttributes ptAttr = UA_ObjectTypeAttributes_default;
|
|
ptAttr.displayName = UA_LOCALIZEDTEXT("en-US", "PumpType");
|
|
UA_Server_addObjectTypeNode(tc.server, pumpTypeId,
|
|
deviceTypeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
|
UA_QUALIFIEDNAME(1, "PumpType"), ptAttr,
|
|
NULL, NULL);
|
|
|
|
UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
|
|
statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
|
|
statusAttr.valueRank = UA_VALUERANK_SCALAR;
|
|
UA_NodeId statusId;
|
|
UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, pumpTypeId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
UA_QUALIFIEDNAME(1, "Status"),
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), statusAttr, NULL, &statusId);
|
|
|
|
UA_Server_addReference(tc.server, statusId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
|
|
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
|
|
|
|
UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
|
|
rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
|
|
rpmAttr.valueRank = UA_VALUERANK_SCALAR;
|
|
UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, pumpTypeId,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
UA_QUALIFIEDNAME(1, "MotorRPMs"),
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), rpmAttr, NULL, NULL);
|
|
}
|
|
|
|
static UA_StatusCode
|
|
pumpTypeConstructor(UA_Server *servertmp,
|
|
const UA_NodeId *sessionId, void *sessionContext,
|
|
const UA_NodeId *typeId, void *typeContext,
|
|
const UA_NodeId *nodeId, void **nodeContext) {
|
|
UA_RelativePathElement rpe;
|
|
UA_RelativePathElement_init(&rpe);
|
|
rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
|
|
rpe.isInverse = false;
|
|
rpe.includeSubtypes = false;
|
|
rpe.targetName = UA_QUALIFIEDNAME(1, "Status");
|
|
|
|
UA_BrowsePath bp;
|
|
UA_BrowsePath_init(&bp);
|
|
bp.startingNode = *nodeId;
|
|
bp.relativePath.elementsSize = 1;
|
|
bp.relativePath.elements = &rpe;
|
|
|
|
UA_BrowsePathResult bpr =
|
|
UA_Server_translateBrowsePathToNodeIds(tc.server, &bp);
|
|
if(bpr.statusCode != UA_STATUSCODE_GOOD ||
|
|
bpr.targetsSize < 1)
|
|
return bpr.statusCode;
|
|
|
|
/* Set the status value */
|
|
UA_Boolean status = true;
|
|
UA_Variant value;
|
|
UA_Variant_setScalar(&value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]);
|
|
UA_Server_writeValue(tc.server, bpr.targets[0].targetId.nodeId, value);
|
|
UA_BrowsePathResult_clear(&bpr);
|
|
|
|
return UA_STATUSCODE_GOOD;
|
|
}
|
|
|
|
static void
|
|
addPumpTypeConstructor(UA_Server *servertmp) {
|
|
UA_NodeTypeLifecycle lifecycle = {0};
|
|
lifecycle.constructor = pumpTypeConstructor;
|
|
lifecycle.destructor = NULL;
|
|
UA_Server_setNodeTypeLifecycle(tc.server, pumpTypeId, lifecycle);
|
|
}
|
|
|
|
#endif //OPEN62541_MT_COMMON
|