1 package de.dlr.bt.stc.bridge.uas;
2
3 import org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode;
4 import org.eclipse.milo.opcua.stack.core.Identifiers;
5 import org.eclipse.milo.opcua.stack.core.UaException;
6 import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
7
8 import de.dlr.bt.stc.bridge.BridgeCfg;
9 import de.dlr.bt.stc.init.Register;
10 import de.dlr.bt.stc.opcuaserver.ANodeCreator;
11 import de.dlr.bt.stc.opcuaserver.NodeFactory;
12 import de.dlr.bt.stc.opcuaserver.STCNamespace;
13 import de.dlr.bt.stc.opcuaserver.STCNamespace.Folders;
14 import lombok.extern.slf4j.Slf4j;
15
16 @Slf4j
17 public class BridgeCfgNode extends ANodeCreator {
18 @Register
19 public static void register() {
20 NodeFactory.getInstance().registerCreator(BridgeCfg.class, BridgeCfgNode::new);
21 }
22
23 private BridgeCfgNode(STCNamespace namespace) {
24 super(namespace, "stc", "bridgecfg");
25 }
26
27 private UaObjectTypeNode typeNode;
28
29 private static final String BRIDGECFG_TYPE = "BridgeCfgType";
30 private static final String MAPPING_TYPE = "MappingType";
31
32 private static final String MEASUREMENT = "Measurement";
33 private static final String DEVICE = "Device";
34 private static final String LOCATION = "Location";
35 private static final String SYMBOLIC_NAME = "SymbolicName";
36 private static final String FIELD = "Field";
37
38 private static final String SOURCE_ID = "SourceID";
39 private static final String SINK_ID = "SinkID";
40 private static final String QUEUE_SIZE = "QueueSize";
41 private static final String QUEUE_DURATION = "QueueDuration";
42 private static final String VALUE_TEMPLATE = "ValueTemplate";
43 private static final String MAPPING = "Mapping";
44
45 @Override
46 public void createObjectType() {
47 try {
48 var measurement = namespace.createObjectTypeComponent(MEASUREMENT,
49 namespace.newNodeId(nodePathType(MEASUREMENT)), Identifiers.String);
50 var device = namespace.createObjectTypeComponent(DEVICE, namespace.newNodeId(nodePathType(DEVICE)),
51 Identifiers.String);
52 var location = namespace.createObjectTypeComponent(LOCATION, namespace.newNodeId(nodePathType(LOCATION)),
53 Identifiers.String);
54 var symbolicname = namespace.createObjectTypeComponent(SYMBOLIC_NAME,
55 namespace.newNodeId(nodePathType(SYMBOLIC_NAME)), Identifiers.String);
56 var field = namespace.createObjectTypeComponent(FIELD, namespace.newNodeId(nodePathType(FIELD)),
57 Identifiers.String);
58
59 var mappingType = namespace.createObjectTypeNode(MAPPING_TYPE,
60 namespace.newNodeId(nodePathType(MAPPING_TYPE)), measurement, device, location, symbolicname,
61 field);
62
63 var sourceid = namespace.createObjectTypeComponent(SOURCE_ID, namespace.newNodeId(nodePathType(SOURCE_ID)),
64 Identifiers.String);
65 var sinkid = namespace.createObjectTypeComponent(SINK_ID, namespace.newNodeId(nodePathType(SINK_ID)),
66 Identifiers.String);
67 var queuesize = namespace.createObjectTypeComponent(QUEUE_SIZE,
68 namespace.newNodeId(nodePathType(QUEUE_SIZE)), Identifiers.Integer);
69 var queueduration = namespace.createObjectTypeComponent(QUEUE_DURATION,
70 namespace.newNodeId(nodePathType(QUEUE_DURATION)), Identifiers.Integer);
71 var valuetemplate = namespace.createObjectTypeComponent(VALUE_TEMPLATE,
72 namespace.newNodeId(nodePathType(VALUE_TEMPLATE)), Identifiers.String);
73
74 var mappingt = namespace.createObjectTypeComponent(MAPPING, namespace.newNodeId(nodePathType(MAPPING)),
75 mappingType, Identifiers.ModellingRule_Mandatory);
76
77 typeNode = namespace.createObjectTypeNode(BRIDGECFG_TYPE, namespace.newNodeId(nodePathType(BRIDGECFG_TYPE)),
78 sourceid, sinkid, queuesize, queueduration, valuetemplate, mappingt);
79 } catch (UaException uae) {
80 log.info("Exception creating ObjectType for BridgeCfg: {}", uae);
81 }
82
83 }
84
85 @Override
86 public void createInstance(Object forNode, Folders folders) {
87 if (!(forNode instanceof BridgeCfg bridgeCfg))
88 return;
89
90 try {
91 String id = bridgeCfg.getId();
92 var uon = namespace.createObjectNode(typeNode, id, namespace.newNodeId(nodePathInst(id)),
93 folders.getConfigFolder());
94
95 namespace.setObjectNodeComponent(uon, SOURCE_ID, new Variant(bridgeCfg.getSourceId()));
96 namespace.setObjectNodeComponent(uon, SINK_ID, new Variant(bridgeCfg.getSinkId()));
97 namespace.setObjectNodeComponent(uon, QUEUE_SIZE, new Variant(bridgeCfg.getQueueSize()));
98 namespace.setObjectNodeComponent(uon, QUEUE_DURATION, new Variant(bridgeCfg.getQueueDuration()));
99 namespace.setObjectNodeComponent(uon, VALUE_TEMPLATE, new Variant(bridgeCfg.getValueTemplate()));
100
101 var mn = namespace.getObjectNodeInstance(uon, MAPPING);
102 if (mn != null && bridgeCfg.getMapping() != null) {
103 namespace.setObjectNodeComponent(mn, DEVICE, new Variant(bridgeCfg.getMapping().getDevice()));
104 namespace.setObjectNodeComponent(mn, LOCATION, new Variant(bridgeCfg.getMapping().getLocation()));
105 namespace.setObjectNodeComponent(mn, MEASUREMENT, new Variant(bridgeCfg.getMapping().getMeasurement()));
106 namespace.setObjectNodeComponent(mn, SYMBOLIC_NAME,
107 new Variant(bridgeCfg.getMapping().getSymbolicName()));
108 namespace.setObjectNodeComponent(mn, FIELD, new Variant(bridgeCfg.getMapping().getField()));
109 }
110
111 addRootNode(forNode, uon);
112 } catch (UaException e) {
113 log.info("Exception during creation of NodeInstance {}: {}", bridgeCfg.getId(), e);
114 }
115
116 }
117
118 }