You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cg...@apache.org on 2024/09/02 03:35:44 UTC
(plc4x-extras) branch feature/merlot updated: Fixed read/write routine for simulated driver.
This is an automated email from the ASF dual-hosted git repository.
cgarcia pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git
The following commit(s) were added to refs/heads/feature/merlot by this push:
new 2cbad20 Fixed read/write routine for simulated driver.
2cbad20 is described below
commit 2cbad201a7cfb2412d9ba82ef8812845ed7a2eb0
Author: César García <ce...@ceos.com.ve>
AuthorDate: Sun Sep 1 23:34:48 2024 -0400
Fixed read/write routine for simulated driver.
---
.../org/apache/plc4x/merlot/api/PlcDevice.java | 7 +-
.../java/org/apache/plc4x/merlot/api/PlcItem.java | 3 +-
.../apache/plc4x/merlot/api/PlcTagFunction.java | 47 +++++
.../plc4x/merlot/api/command/DemoCommand002.java | 5 +-
.../merlot/api/core/PlcDeviceManagedService.java | 4 +-
.../plc4x/merlot/api/impl/PlcDeviceImpl.java | 131 ++++++------
.../apache/plc4x/merlot/api/impl/PlcGroupImpl.java | 24 ++-
.../apache/plc4x/merlot/api/impl/PlcItemImpl.java | 83 ++------
.../plc4x/merlot/das/base/impl/BaseDeviceImpl.java | 4 -
.../plc4x/merlot/das/base/impl/BaseItemImpl.java | 36 ++--
.../org/apache/plc4x/merlot/db/api/DBRecord.java | 56 ++++-
.../plc4x/merlot/db/api/DBRecordFactory.java | 6 +-
.../db/api/{DBRecord.java => DBWriterHandler.java} | 9 +-
.../apache/plc4x/merlot/db/core/DBBaseFactory.java | 20 +-
.../plc4x/merlot/db/core/DBBooleanFactory.java | 54 +++--
.../apache/plc4x/merlot/db/core/DBByteFactory.java | 69 ++++--
.../plc4x/merlot/db/core/DBDoubleFactory.java | 38 ++--
.../plc4x/merlot/db/core/DBFloatFactory.java | 48 +++--
.../apache/plc4x/merlot/db/core/DBIntFactory.java | 40 ++--
.../apache/plc4x/merlot/db/core/DBLongFactory.java | 36 ++--
.../merlot/db/core/DBRecordsManagedService.java | 71 ++++---
.../plc4x/merlot/db/core/DBShortFactory.java | 41 ++--
.../plc4x/merlot/db/core/DBStringFactory.java | 35 ++--
.../plc4x/merlot/db/core/DBUByteFactory.java | 37 ++--
.../apache/plc4x/merlot/db/core/DBUIntFactory.java | 37 ++--
.../plc4x/merlot/db/core/DBULongFactory.java | 39 ++--
.../plc4x/merlot/db/core/DBUShortFactory.java | 41 ++--
.../plc4x/merlot/db/impl/DBWriterHandlerImpl.java | 118 +++++++++++
.../resources/OSGI-INF/blueprint/db-service.xml | 7 +-
.../pom.xml | 31 ++-
.../apache/plc4x/merlot/drv/mb/api/MyService.java | 23 ++
.../plc4x/merlot/drv/mb/api/MyServiceImpl.java | 25 +++
.../drv/mb/impl/ModbusPlcTagFunctionImpl.java | 54 +++++
.../resources/OSGI-INF/blueprint/my-service.xml | 24 +++
.../pom.xml | 31 ++-
.../apache/plc4x/merlot/drv/s7/api/MyService.java | 23 ++
.../plc4x/merlot/drv/s7/api/MyServiceImpl.java | 25 +++
.../merlot/drv/s7/impl/S7PlcTagFunctionImpl.java | 54 +++++
.../resources/OSGI-INF/blueprint/s7-service.xml} | 38 ++--
.../org.apache.plc4x.merlot.drv.simulated/pom.xml | 3 +-
.../impl/SimulatedPlcTagFunctionImpl.java | 109 ++++++++++
.../OSGI-INF/blueprint/simulated-drv-service.xml | 24 ++-
.../src/main/feature/feature.xml | 5 +-
plc4j/tools/merlot/pom.xml | 231 +++++++++++++++++++--
44 files changed, 1375 insertions(+), 471 deletions(-)
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
index a5b1b4a..dd6a7c7 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
@@ -130,12 +130,7 @@ public interface PlcDevice extends org.osgi.service.device.Device, org.osgi.serv
*
*/
public List<PlcGroup> getGroups();
-
- /*
- *
- */
- public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args);
-
+
/*
*
*/
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
index e14f33f..66c9199 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
@@ -20,6 +20,7 @@ package org.apache.plc4x.merlot.api;
import com.lmax.disruptor.RingBuffer;
import io.netty.buffer.ByteBuf;
+
import java.util.Date;
import java.util.Hashtable;
import java.util.UUID;
@@ -221,6 +222,6 @@ public interface PlcItem {
/*
*
*/
- public void itemWrite();
+ public void itemWrite(final ByteBuf byteBuf, int offset);
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java
new file mode 100644
index 0000000..a397d8a
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.merlot.api;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.osgi.service.dal.Function;
+
+/**
+ * This function is intended for the construction of the write Tags.
+ * It should expect a String representing a Tag or a PlcTag.
+ * In the case of BYTE-oriented drivers such as Modbus or S7,
+ * priority should be given to writing bit arrays or byte arrays.
+ * In the case of Tag-oriented drivers such as Ethernet/IP,
+ * handling should be done for each particular case.
+ *
+ */
+public interface PlcTagFunction extends Function {
+
+ /*
+ * PlcTag reference for constructing the String that represents
+ * the write tag.
+ *
+ * @param plcTag PlcTag reference PlcTag
+ * @paraf byteBuf ByteBuf
+ * @return
+ */
+ public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf);
+
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
index df9151f..e9ba4c9 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
@@ -71,7 +71,7 @@ public class DemoCommand002 implements Action {
item = new PlcItemImpl.PlcItemBuilder("ITEM_00" + i).
setItemDescription("THE ITEM 00" + i).
- setItemId("RANDOM/foo_" +i + ":INT[10]").
+ setItemId("RANDOM/foo_" +i + ":BYTE[10]").
setItemEnable(true).
build();
@@ -79,7 +79,8 @@ public class DemoCommand002 implements Action {
};
-
+ grupo1.enable();
+ d.enable();
});
return null;
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
index 8951193..851eced 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
@@ -62,7 +62,7 @@ public class PlcDeviceManagedService implements ManagedService, ConfigurationLis
}
public String getName() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
/*
@@ -175,7 +175,7 @@ public class PlcDeviceManagedService implements ManagedService, ConfigurationLis
@Override
public void configurationEvent(ConfigurationEvent event) {
- LOGGER.info(">>> Cambio de configuración: " + event.getPid());
+ LOGGER.info("Configuration change: " + event.getPid());
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
index 9ba4f08..1d57905 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
@@ -21,25 +21,27 @@ import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.SequenceBarrier;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.util.DaemonThreadFactory;
-import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Level;
import static java.util.stream.Collectors.toList;
import org.apache.commons.lang3.time.StopWatch;
+import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.PlcDriver;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest.Builder;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.api.model.PlcTag;
import org.apache.plc4x.java.api.value.PlcValue;
-import org.apache.plc4x.java.simulated.tag.SimulatedTag;
import org.apache.plc4x.merlot.api.PlcDevice;
import org.osgi.framework.BundleContext;
import org.osgi.service.dal.Device;
@@ -48,8 +50,9 @@ import org.osgi.service.device.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.plc4x.merlot.api.PlcGroup;
-import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
import org.apache.plc4x.merlot.scheduler.api.Job;
+import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
/*
@@ -66,7 +69,12 @@ public class PlcDeviceImpl implements PlcDevice {
private static final String FILTER_DEVICE = "(&(" +
org.osgi.framework.Constants.OBJECTCLASS +
"=" + PlcDevice.class.getName() + ")" +
- "(" + PlcDevice.SERVICE_UID + "=*))";
+ "(" + PlcDevice.SERVICE_UID + "=*))";
+
+ private static String FILTER_PLCTAGFUNCTION = "(&(" +
+ org.osgi.framework.Constants.OBJECTCLASS +
+ "=" + PlcTagFunction.class.getName() + ")" +
+ "(dal.function.device.UID=*))";
protected final BundleContext bc;
protected boolean enable = false;
@@ -83,6 +91,9 @@ public class PlcDeviceImpl implements PlcDevice {
private StopWatch watch = new StopWatch();
int[] messageCounter = new int[2];
+ private PlcTagFunction plcTagFunction = null;
+ private final ArrayList<ImmutablePair<String, Object[]>> writeBuffer = new ArrayList<>();
+
//
Disruptor<PlcDeviceReadEvent> readDisruptor =
new Disruptor<>(PlcDeviceReadEvent::new, BUFFER_SIZE, DaemonThreadFactory.INSTANCE);
@@ -133,7 +144,7 @@ public class PlcDeviceImpl implements PlcDevice {
readRingBuffer,
readSequenceBarrier,
(event, sequence, endofbatch)->{
- LOGGER.info("Ejecutando sequencia de lectura...");
+ LOGGER.debug("Reader rutine...");
if (null != event.getPlcGroup()){
if (null != plcConnection) {
if (refPlcConnection.get().isConnected()) {
@@ -150,9 +161,9 @@ public class PlcDeviceImpl implements PlcDevice {
event.getPlcGroup().getGroupItems().forEach((u,i) -> {
final PlcValue plcValue = syncResponse.getPlcValue(i.getItemName());
if (null == plcValue) {
- LOGGER.info("Item[{}] = {} ", i.getItemName(),"Null value");
+ LOGGER.debug("Item[{}] = {} ", i.getItemName(),"Null value");
} else {
- LOGGER.info("Item[{}] Read ", i.getItemName());
+ LOGGER.debug("Item[{}] Read ", i.getItemName());
i.setPlcValue(plcValue);
}
});
@@ -187,37 +198,39 @@ public class PlcDeviceImpl implements PlcDevice {
if (null != event.getPlcItem()){
if (null != plcConnection) {
if (refPlcConnection.get().isConnected()) {
- watch.start();
if (messageCounter[0] == 0) {
readProcessor.pause();
}
-
messageCounter[0]++;
-
- final PlcItem plcItem = event.getPlcItem();
- final PlcTag plcTag = plcItem.getItemPlcTag();
-
- String strTag = getWritePlcTag(plcTag,
- event.getByteBuf());
-
- final PlcWriteRequest writeRequest =
- refPlcConnection.get().writeRequestBuilder().
- addTagAddress("bar", strTag, event.getByteBuf().array()).
- build();
-
- //TODO: Agregar tiempo de supervision
- PlcWriteResponse writeResponse =
- writeRequest.execute().get();
-
- LOGGER.info("Write to: " + event.getByteBuf().array());
- watch.stop();
- LOGGER.debug("Elapse time: " + watch.getTime());
- watch.reset();
+ LOGGER.info("Writer sequence...");
+ if (null != plcTagFunction) {
+ writeBuffer.add(plcTagFunction.getStringTag(
+ event.getPlcItem().getItemPlcTag(),
+ event.getByteBuf()));
+ }
+
+ /*
+ * A maximum of DEFAULT_WRITE_BATCH_SIZE or there
+ * are no more messages in the ringbuffer,
+ * the write will proceed.
+ */
if ((messageCounter[0] > DEFAULT_WRITE_BATCH_SIZE) || (endofbatch)) {
- readProcessor.pause();
+ if (!writeBuffer.isEmpty()) {
+ final Builder builder = refPlcConnection.get().writeRequestBuilder();
+ writeBuffer.forEach(i -> builder.addTagAddress(Long.toString(System.nanoTime()), i.left, i.right));
+ final PlcWriteRequest writeRequest = builder.build();
+ writeBuffer.clear();
+ //TODO: Max time of waiting
+ PlcWriteResponse writeResponse =
+ writeRequest.execute().get();
+ //TODO: Change to debug
+ writeResponse.getTagNames().forEach( t->
+ LOGGER.info("Write tag[{}] is {}", t, writeResponse.getResponseCode(t))
+ );
+ }
+ readProcessor.restart();
messageCounter[0] = 0;
- }
-
+ }
}
}
}
@@ -255,7 +268,7 @@ public class PlcDeviceImpl implements PlcDevice {
//Try to connect
final String url = (String) deviceProperties.get(Device.SERVICE_DRIVER);
try {
- System.out.println("URL : " + url);
+ LOGGER.info("Device{} with url {}", Device.SERVICE_DRIVER, url);
plcConnection = plcDriver.getConnection(url);
plcConnection.connect();
refPlcConnection.set(plcConnection);
@@ -353,6 +366,7 @@ public class PlcDeviceImpl implements PlcDevice {
group.setGroupDeviceUid(UUID.fromString((String) deviceProperties.get(PlcDevice.SERVICE_UID)));
group.setPlcConnection(refPlcConnection);
group.setReadRingBuffer(readRingBuffer);
+ group.setWriteRingBuffer(writeRingBuffer);
deviceGroups.put(group.getGroupUid(), group);
bc.registerService(new String[]{Job.class.getName(),
PlcGroup.class.getName()},
@@ -404,43 +418,34 @@ public class PlcDeviceImpl implements PlcDevice {
@Override
public void attach(PlcDriver driver) {
+ Collection<ServiceReference<PlcTagFunction>> serviceRefences = null;
LOGGER.info("Device: {} attach to driver {} ", deviceProperties.get(Device.SERVICE_NAME), driver.getProtocolCode());
this.plcDriver = driver;
+
+ String filter = FILTER_PLCTAGFUNCTION.replace("*", plcDriver.getProtocolCode());
+
+ try {
+ serviceRefences = bc.getServiceReferences(PlcTagFunction.class, filter);
+ } catch (InvalidSyntaxException ex) {
+ LOGGER.info(ex.getMessage());
+ }
+
+ if (null == serviceRefences) {
+ LOGGER.info("PlcTagFunction don´t found for {} driver.", plcDriver.getProtocolCode());
+ LOGGER.info("Query {}", filter);
+ } else {
+ plcTagFunction = (PlcTagFunction) bc.getService((ServiceReference<PlcTagFunction>) serviceRefences.toArray()[0]);
+ LOGGER.info("PlcTagFunction assigned for {} driver.", plcDriver.getProtocolCode());
+ }
+
}
@Override
public PlcConnection getPlcConnection() {
return plcConnection;
}
-
- @Override
- public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args) {
- String strTag = null;
- if (plcTag instanceof SimulatedTag) {
- final SimulatedTag localTag = (SimulatedTag) plcTag;
- switch (plcTag.getPlcValueType()) {
- case BOOL:;
- strTag = localTag.getType().name() + "/" +
- localTag.getName() +
- ":BOOL" +
- "[" +
- byteBuf.capacity() +
- "]";
- break;
- case BYTE:;
- strTag = localTag.getType().name() + "/" +
- localTag.getName() +
- ":BYTE" +
- "[" +
- byteBuf.capacity() +
- "]";
- break;
-
- };
- }
-
- return strTag;
- }
+
+
public static class PlcDeviceBuilder {
private final BundleContext bc;
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
index a65d004..5dec6e1 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
@@ -20,6 +20,7 @@ import com.lmax.disruptor.RingBuffer;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@@ -27,6 +28,7 @@ import org.apache.commons.lang3.time.StopWatch;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.model.PlcTag;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.merlot.scheduler.api.Job;
import org.apache.plc4x.merlot.scheduler.api.JobContext;
@@ -50,6 +52,7 @@ public class PlcGroupImpl implements PlcGroup, Job {
private UUID groupUid;
private boolean enable = false;
+ private boolean isFirtsRun = true;
private long groupTransmit = 0;
private long groupReceives = 0;
@@ -216,9 +219,11 @@ public class PlcGroupImpl implements PlcGroup, Job {
}
@Override
- public void putItem(PlcItem item) {
- if (!groupItems.containsKey(item.getItemUid())) {
- groupItems.put(item.getItemUid(), item);
+ public void putItem(PlcItem plcItem) {
+ if (!groupItems.containsKey(plcItem.getItemUid())) {
+ plcItem.setRingBuffer(writeRingBuffer);
+ groupItems.put(plcItem.getItemUid(), plcItem);
+
//bc.registerService(PlcItem.class.getName(), item, item.getProperties());
}
}
@@ -248,13 +253,22 @@ public class PlcGroupImpl implements PlcGroup, Job {
if (enable) {
if ((null != refPlcConnection) && (null != refPlcConnection.get())) {
if (refPlcConnection.get().isConnected()) {
+ if (isFirtsRun) {
+ groupItems.forEach((u,i) ->{
+ Optional<PlcTag> refPlcTag = refPlcConnection.get().parseTagAddress(i.getItemId());
+ if (refPlcTag.isPresent()) {
+ i.setItemPlcTag(refPlcTag.get());
+ } else {
+ i.disable();
+ }
+ });
+ isFirtsRun = false;
+ }
//executeReadAllItems();
long sequenceId = readRingBuffer.next();
final PlcDeviceReadEvent readEvent = readRingBuffer.get(sequenceId);
readEvent.setPlcGroup(this);
readRingBuffer.publish(sequenceId);
- LOGGER.info("Elapse time: " + watch.getTime());
- watch.reset();
} else {
LOGGER.info("The driver is disconnected.");
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
index 9231461..456e190 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
@@ -61,8 +61,9 @@ public class PlcItemImpl implements PlcItem {
private LinkedList<PlcItemListener> itemClients = null;
- private byte[] itemInnerBuffer = null;
+ private byte[] itemInnerBuffer = null;
private ByteBuf itemBuffer = null;
+
private long itemTransmit = 0;
private long itemReceives = 0;
@@ -75,7 +76,7 @@ public class PlcItemImpl implements PlcItem {
private Date lastWriteDate;
private Date lastErrorDate;
- private RingBuffer<PlcDeviceWriteEvent> ringBuffer;
+ private RingBuffer<PlcDeviceWriteEvent> writeRingBuffer = null;
public PlcItemImpl(PlcItemBuilder builder) {
@@ -223,6 +224,7 @@ public class PlcItemImpl implements PlcItem {
@Override
public void setPlcValue(PlcValue plcvalue) {
try {
+ //Creates the default buffer associated with the requested data.
if (null == itemInnerBuffer) {
int size = (plcvalue instanceof PlcList) ?
((PlcList) plcvalue).getLength() *
@@ -232,7 +234,8 @@ public class PlcItemImpl implements PlcItem {
new byte[size];
itemBuffer = Unpooled.wrappedBuffer(itemInnerBuffer);
}
-
+
+ //Transfers data to a byte buffer
itemBuffer.resetWriterIndex();
if (plcvalue instanceof PlcList) {
((PlcList) plcvalue).getList().forEach(v -> itemBuffer.writeBytes(v.getRaw()));
@@ -251,64 +254,6 @@ public class PlcItemImpl implements PlcItem {
//Update all clients
itemClients.forEach(c -> c.update());
-//
-// lock.lock();
-// try {
-// this.itemPlcValue = plcvalue;
-// itemBuffer.clear();
-// switch (itemPlcTag.getPlcValueType()){
-// case BYTE:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeByte(p.getByte());});
-// break;
-// case CHAR:
-// case STRING:
-// plcResponse.getAllStrings(itemUid.toString()).forEach(s -> {
-// itemBuffer.writeBytes(s.getBytes());
-// });
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeBytes(p.getRaw());});
-// break;
-// case WORD:
-// case USINT:
-// case SINT:
-// case UINT:
-// case INT:
-// case DINT:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeShort(p.getShort());});
-// break;
-// case UDINT:
-// case ULINT:
-// case LINT:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getLong());});
-// break;
-// case BOOL:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeBoolean(p.getBoolean());});
-// break;
-// case REAL:
-// case LREAL:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeFloat(p.getFloat());});
-// break;
-// case DATE_AND_TIME:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getDateTime().toEpochSecond(ZoneOffset.UTC));});
-// break;
-// case DATE:
-// plcResponse.getAllDates(itemUid.toString()).forEach(dt -> {
-// itemBuffer.writeLong(dt.toEpochDay());
-// });
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getDateTime().toLocalDate().toEpochDay());});
-// break;
-// case TIME:
-// break;
-// case TIME_OF_DAY:
-// itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getTime().toEpochSecond(LocalDate.MAX, ZoneOffset.UTC));});
-// break;
-// default:
-// throw new NotImplementedException("The response type for datatype " + itemPlcValue.getPlcValueType() + " is not yet implemented");
-// }
-// } catch (Exception ex) {
-//
-// } finally {
-// lock.unlock();
-// }
}
@Override
@@ -387,13 +332,21 @@ public class PlcItemImpl implements PlcItem {
@Override
public void setRingBuffer(RingBuffer<PlcDeviceWriteEvent> ringBuffer) {
- this.ringBuffer = ringBuffer;
+ this.writeRingBuffer = ringBuffer;
}
@Override
- public void itemWrite() {
-
-
+ public void itemWrite(final ByteBuf byteBuf, int offset) {
+ if (null == writeRingBuffer) {
+ System.out.println("*** Rinbuffer es null ***");
+ return;
+ }
+ long sequenceId = writeRingBuffer.next();
+ final PlcDeviceWriteEvent writeEvent = writeRingBuffer.get(sequenceId);
+ writeEvent.setPlcItem(this);
+ writeEvent.setByteBuf(byteBuf);
+ writeEvent.setOffset(offset);
+ writeRingBuffer.publish(sequenceId);
}
@Override
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
index 907fe18..148ca67 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
@@ -216,10 +216,6 @@ import org.apache.plc4x.merlot.api.PlcGroup;
this.plcdriver = driver;
}
- @Override
- public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
- }
@Override
public PlcConnection getPlcConnection() {
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
index 54286e6..81ff37a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
@@ -58,22 +58,22 @@ public class BaseItemImpl implements PlcItem {
@Override
public void setPlcValue(PlcValue plcvalue) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcValue getItemPlcValue() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ByteBuf getItemByteBuf() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public byte[] getInnerBuffer() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@@ -186,57 +186,57 @@ public class BaseItemImpl implements PlcItem {
@Override
public PlcTag getItemPlcTag() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setItemPlcTag(PlcTag itemplctag) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcResponseCode getDataQuality() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setDataQuality(PlcResponseCode dataquality) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void enable() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void disable() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Hashtable<String, Object> getProperties() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setRingBuffer(RingBuffer<PlcDeviceWriteEvent> ringBuffer) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void itemWrite() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ public void addItemListener(PlcItemListener client) {
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void addItemListener(PlcItemListener client) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ public void removeItemListener(PlcItemListener client) {
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void removeItemListener(PlcItemListener client) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ public void itemWrite(ByteBuf byteBuf, int offset) {
+ throw new UnsupportedOperationException("Not supported yet.");
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
index e531f90..88c87e8 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
@@ -19,6 +19,60 @@
package org.apache.plc4x.merlot.db.api;
-public interface DBRecord {
+
+import io.netty.buffer.ByteBuf;
+import java.util.Optional;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdatabase.PVRecord;
+
+
+public class DBRecord extends PVRecord {
+ protected static final String MONITOR_FIELDS = "field(write_value,"+
+ "id,"+
+ "offset,"+
+ "description,"+
+ "scan_time,"+
+ "scan_enable,"+
+ "write_enable,"+
+ "display{limitLow,limitHigh},"+
+ "control{limitLow,limitHigh,minStep})";
+
+ protected static final String MONITOR_VALUE_FIELD = "field(value)";
+ protected static final String MONITOR_WRITE_FIELD = "field(write_value)";
+
+
+ protected PlcItem plcItem = null;
+ protected ByteBuf innerBuffer = null;
+ protected ByteBuf innerWriteBuffer = null;
+ protected int offset = 0;
+
+ public DBRecord(String recordName, PVStructure pvStructure) {
+ super(recordName, pvStructure);
+ }
+
+ public Optional<PlcItem> getPlcItem(){
+ if (null == plcItem) Optional.empty();
+ return Optional.of(plcItem);
+ };
+
+ public Optional<ByteBuf> getInnerBuffer(){
+ if (null == innerBuffer) Optional.empty();
+ return Optional.of(innerBuffer);
+ };
+
+ public Optional<ByteBuf> getWriteBuffer(){
+ if (null == innerWriteBuffer) Optional.empty();
+ return Optional.of(innerWriteBuffer);
+ };
+
+ public int getOffset(){
+ return offset;
+ }
+
+ public String getFieldsToMonitor(){
+ return MONITOR_VALUE_FIELD;
+ };
+
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
index acde979..a0dc98c 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
@@ -23,10 +23,10 @@ import org.epics.pvdatabase.PVRecord;
public interface DBRecordFactory {
- public PVRecord create(String recordName);
+ public DBRecord create(String recordName);
- public PVRecord createArray(String recordName, int length);
+ public DBRecord createArray(String recordName, int length);
- public PVRecord create(String recordName, String[] fields);
+ public DBRecord create(String recordName, String[] fields);
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
similarity index 78%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
index e531f90..0cdb7d3 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
@@ -18,7 +18,14 @@
*/
package org.apache.plc4x.merlot.db.api;
+import org.epics.pvdata.monitor.MonitorRequester;
-public interface DBRecord {
+public interface DBWriterHandler extends MonitorRequester{
+
+
+
+ public void putDBRecord(DBRecord dbRecord);
+
+ public void removeDBRecord(DBRecord dbRecord);
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
index b81df55..69b11ce 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
@@ -18,7 +18,9 @@
*/
package org.apache.plc4x.merlot.db.core;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.apache.plc4x.merlot.db.api.DBRecordFactory;
+import org.epics.pvdata.copy.CreateRequest;
import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVDouble;
import org.epics.pvdata.pv.PVInt;
@@ -33,18 +35,19 @@ public class DBBaseFactory implements DBRecordFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(DBBaseFactory.class);
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public PVRecord create(String recordName, String[] fields) {
- PVRecord pvRecord = null;
+ public DBRecord create(String recordName, String[] fields) {
+
+ DBRecord dbRecord = null;
PVStructure structure = null;
PVString pvString = null;
PVBoolean pvBoolean = null;
@@ -65,12 +68,12 @@ public class DBBaseFactory implements DBRecordFactory {
}
if (!isArray){
- pvRecord = create(recordName);
+ dbRecord = create(recordName);
} else {
- pvRecord = createArray(recordName,lengthArray);
+ dbRecord = createArray(recordName,lengthArray);
}
- structure = pvRecord.getPVStructure();
+ structure = dbRecord.getPVStructure();
pvString = structure.getStringField("id");
pvString.put(fields[1]);
} else return null;
@@ -82,7 +85,6 @@ public class DBBaseFactory implements DBRecordFactory {
if (!fields[3].isEmpty()) {
pvString = structure.getStringField("descriptor");
- System.out.println("Valor de fields[3]: " + fields[3]);
pvString.put(fields[3]);
} else return null;
@@ -145,7 +147,7 @@ public class DBBaseFactory implements DBRecordFactory {
pvDouble.put(Double.parseDouble(fields[14]));
}
- return pvRecord;
+ return dbRecord;
} catch (Exception ex) {
ex.printStackTrace();
LOGGER.info(ex.toString());
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
index dc5260c..56f7b3c 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
@@ -18,10 +18,11 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -30,10 +31,8 @@ import org.epics.pvdata.factory.FieldFactory;
import org.epics.pvdata.pv.FieldCreate;
import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVBooleanArray;
-import org.epics.pvdata.pv.PVString;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdata.pv.ScalarType;
-import org.epics.pvdatabase.PVRecord;
public class DBBooleanFactory extends DBBaseFactory {
@@ -43,7 +42,7 @@ public class DBBooleanFactory extends DBBaseFactory {
public DBBooleanFactory() {};
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvBoolean).
@@ -51,18 +50,19 @@ public class DBBooleanFactory extends DBBaseFactory {
add("id", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createScalar(ScalarType.pvBoolean)).
addAlarm().
addTimeStamp().
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBBooleanRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +71,8 @@ public class DBBooleanFactory extends DBBaseFactory {
add("id", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvBoolean, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -80,20 +81,19 @@ public class DBBooleanFactory extends DBBaseFactory {
PVBooleanArray pvValue = (PVBooleanArray) pvStructure.getScalarArrayField("value", ScalarType.pvBoolean);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBBooleanRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBBooleanRecord extends PVRecord implements PlcItemListener {
+ class DBBooleanRecord extends DBRecord implements PlcItemListener {
private PVBoolean value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
- private int offset = 0;
-
+ private PVBoolean write_value;
+
public DBBooleanRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getBooleanField("value");
+ value = pvStructure.getBooleanField("value");
+ write_value = pvStructure.getBooleanField("write_value");
}
/**
@@ -103,8 +103,16 @@ public class DBBooleanFactory extends DBBaseFactory {
public void process()
{
super.process();
- if (null != plcItem )
- plcItem.itemWrite();
+ if (null != plcItem) {
+ System.out.println("Paso por Boolean");
+ if (value.get() != write_value.get()) {
+ final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+ if (isWriteEnbale.get()) {
+ write_value.put(value.get());
+
+ }
+ }
+ }
}
@Override
@@ -125,6 +133,12 @@ public class DBBooleanFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getBoolean(0))
value.put(innerBuffer.getBoolean(0));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
+
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
index daad838..d8646b6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
@@ -18,21 +18,26 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
import org.epics.nt.NTScalarBuilder;
+import org.epics.pvdata.copy.PVCopy;
import org.epics.pvdata.factory.FieldFactory;
import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVByte;
import org.epics.pvdata.pv.PVByteArray;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdata.pv.ScalarType;
+import org.epics.pvdatabase.PVListener;
import org.epics.pvdatabase.PVRecord;
+import org.epics.pvdatabase.PVRecordField;
+import org.epics.pvdatabase.PVRecordStructure;
public class DBByteFactory extends DBBaseFactory {
@@ -43,7 +48,7 @@ public class DBByteFactory extends DBBaseFactory {
}
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvByte).
@@ -52,18 +57,19 @@ public class DBByteFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createScalar(ScalarType.pvByte)).
addAlarm().
addTimeStamp().
addDisplay().
- addControl().
+ addControl().
createPVStructure();
- PVRecord pvRecord = new DBByteRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBByteRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -73,29 +79,31 @@ public class DBByteFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvByte, length)).
addAlarm().
addTimeStamp().
addDisplay().
- addControl().
+ addControl().
createPVStructure();
PVByteArray pvValue = (PVByteArray) pvStructure.getScalarArrayField("value", ScalarType.pvByte);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBByteRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBByteRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBByteRecord extends PVRecord implements PlcItemListener {
-
+ class DBByteRecord extends DBRecord implements PlcItemListener {
+
private PVByte value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
- private int offset = 0;
-
+ private PVByte write_value;
+ private PVBoolean write_enable;
+
public DBByteRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getByteField("value");
+ value = pvStructure.getByteField("value");
+ write_value = pvStructure.getByteField("write_value");
+ write_enable = pvStructure.getBooleanField("write_enable");
}
/**
@@ -103,8 +111,17 @@ public class DBByteFactory extends DBBaseFactory {
* The main code is here.
*/
public void process()
- {
- super.process();
+ {
+ if (null != plcItem) {
+ if (value.get() != write_value.get()) {
+ if (write_enable.get()) {
+ write_value.put(value.get());
+ innerWriteBuffer.clear();
+ innerWriteBuffer.writeByte(write_value.get());
+ super.process();
+ }
+ }
+ }
}
@Override
@@ -112,6 +129,7 @@ public class DBByteFactory extends DBBaseFactory {
this.plcItem = plcItem;
offset = this.getPVStructure().getIntField("offset").get() * Byte.BYTES;
innerBuffer = Unpooled.wrappedBuffer(plcItem.getInnerBuffer(), offset, Byte.BYTES);
+ innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
}
@Override
@@ -123,9 +141,16 @@ public class DBByteFactory extends DBBaseFactory {
public void update() {
if (null != plcItem) {
if (value.get() != innerBuffer.getByte(0))
- value.put(innerBuffer.getByte(0));
+ value.put(innerBuffer.getByte(0));
}
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_FIELDS;
+ }
+
+
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
index f139791..83d1d60 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
@@ -18,10 +18,11 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +41,7 @@ public class DBDoubleFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvDouble).
@@ -55,12 +56,12 @@ public class DBDoubleFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBDoubleRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBDoubleRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +71,8 @@ public class DBDoubleFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvDouble, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -79,20 +81,20 @@ public class DBDoubleFactory extends DBBaseFactory {
PVDoubleArray pvValue = (PVDoubleArray) pvStructure.getScalarArrayField("value", ScalarType.pvDouble);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBDoubleRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBDoubleRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBDoubleRecord extends PVRecord implements PlcItemListener {
+ class DBDoubleRecord extends DBRecord implements PlcItemListener {
private PVDouble value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVDouble write_value;
private int offset = 0;
public DBDoubleRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getDoubleField("value");
+ value = pvStructure.getDoubleField("value");
+ write_value = pvStructure.getDoubleField("write_value");
}
/**
@@ -102,6 +104,11 @@ public class DBDoubleFactory extends DBBaseFactory {
public void process()
{
super.process();
+ if (null != plcItem) {
+ System.out.println("Paso por Double");
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -122,6 +129,11 @@ public class DBDoubleFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getDouble(0))
value.put(innerBuffer.getDouble(0));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
index 135a994..19f0e3e 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
@@ -18,16 +18,17 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
import org.epics.nt.NTScalarBuilder;
import org.epics.pvdata.factory.FieldFactory;
import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVFloat;
import org.epics.pvdata.pv.PVFloatArray;
import org.epics.pvdata.pv.PVString;
@@ -41,7 +42,7 @@ public class DBFloatFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvFloat).
@@ -56,12 +57,12 @@ public class DBFloatFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBFloatRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBFloatRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +72,8 @@ public class DBFloatFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvFloat, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -80,31 +82,38 @@ public class DBFloatFactory extends DBBaseFactory {
PVFloatArray pvValue = (PVFloatArray) pvStructure.getScalarArrayField("value", ScalarType.pvFloat);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBFloatRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBFloatRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBFloatRecord extends PVRecord implements PlcItemListener {
+ class DBFloatRecord extends DBRecord implements PlcItemListener {
private PVFloat value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVFloat write_value;
private int offset = 0;
public DBFloatRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
value = pvStructure.getFloatField("value");
+ write_value = pvStructure.getFloatField("write_value");
}
/**
- * Implement real time data to the record.
- * The main code is here.
- */
+ * Implement real time data to the record.
+ * The main code is here.
+ */
public void process()
{
super.process();
- if (null != plcItem )
- plcItem.itemWrite();
+ if (null != plcItem) {
+ System.out.println("Paso por Float");
+ if (value.get() != write_value.get()) {
+ final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+ if (isWriteEnbale.get()) {
+ write_value.put(value.get());
+ }
+ }
+ }
}
@Override
@@ -125,6 +134,11 @@ public class DBFloatFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getFloat(0))
value.put(innerBuffer.getFloat(0));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
index e1825b4..955a6ce 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBIntFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvInt).
@@ -55,12 +55,12 @@ public class DBIntFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBIntRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBIntRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBIntFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvInt, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -79,20 +80,20 @@ public class DBIntFactory extends DBBaseFactory {
PVIntArray pvValue = (PVIntArray) pvStructure.getScalarArrayField("value", ScalarType.pvInt);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBIntRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBIntRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBIntRecord extends PVRecord implements PlcItemListener {
+ class DBIntRecord extends DBRecord implements PlcItemListener {
- private PVInt value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVInt value;
+ private PVInt write_value;
private int offset = 0;
public DBIntRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getIntField("value");
+ value = pvStructure.getIntField("value");
+ write_value = pvStructure.getIntField("write_value");
}
/**
@@ -102,7 +103,11 @@ public class DBIntFactory extends DBBaseFactory {
public void process()
{
super.process();
-
+ if (null != plcItem) {
+ System.out.println("Paso por Int");
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -123,6 +128,11 @@ public class DBIntFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getInt(0))
value.put(innerBuffer.getInt(0));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
index 1df1207..aeb59fb 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBLongFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvLong).
@@ -55,12 +55,12 @@ public class DBLongFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBLongRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBLongRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBLongFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvLong, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -79,20 +80,20 @@ public class DBLongFactory extends DBBaseFactory {
PVLongArray pvValue = (PVLongArray) pvStructure.getScalarArrayField("value", ScalarType.pvLong);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBLongRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBLongRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBLongRecord extends PVRecord implements PlcItemListener {
+ class DBLongRecord extends DBRecord implements PlcItemListener {
private PVLong value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVLong write_value;
private int offset = 0;
public DBLongRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getLongField("value");
+ value = pvStructure.getLongField("value");
+ write_value = pvStructure.getLongField("write_value");
}
/**
@@ -102,6 +103,10 @@ public class DBLongFactory extends DBBaseFactory {
public void process()
{
super.process();
+ if (null != plcItem) {
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@@ -123,5 +128,10 @@ public class DBLongFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getLong(0))
value.put(innerBuffer.getLong(0));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
index b9330a1..696de76 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
@@ -37,10 +37,21 @@ import org.apache.plc4x.merlot.api.PlcDevice;
import org.apache.plc4x.merlot.api.PlcGeneralFunction;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.api.DBWriterHandler;
+import org.epics.pvdata.copy.CreateRequest;
+import org.epics.pvdata.misc.BitSet;
+import org.epics.pvdata.monitor.Monitor;
+import org.epics.pvdata.monitor.MonitorElement;
+import org.epics.pvdata.monitor.MonitorRequester;
+import org.epics.pvdata.pv.MessageType;
import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdata.pv.Status;
+import org.epics.pvdata.pv.Structure;
import org.epics.pvdatabase.PVDatabase;
import org.epics.pvdatabase.PVRecord;
+import org.epics.pvdatabase.pva.MonitorFactory;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
@@ -53,26 +64,31 @@ import org.slf4j.LoggerFactory;
public class DBRecordsManagedService implements ManagedServiceFactory, Job {
private static final Logger LOGGER = LoggerFactory.getLogger(DBRecordsManagedService.class);
+ private static final String DEFAULT_REQUEST = "field(write_value,scan_rate,scan_enable,control.limitLow)";
+ private String filter = "(&(" + Constants.OBJECTCLASS + "=" + DBRecordFactory.class.getName() + ")"+
+ "(db.record.type=*))";
+
private final PlcGeneralFunction generalFunction;
private final PVDatabase master;
private static Map<String, Dictionary<String, ?>> waitingConfigs = null;
static final String PID = "org.apache.plc4x.merlot.db.records";
static final String FILE_PATH = "felix.fileinstall.filename";
- private String filter = "(&(" + Constants.OBJECTCLASS + "=" + DBRecordFactory.class.getName() + ")"+
- "(db.record.type=*))";
-
private ServiceReference[] references = null;
private final BundleContext bundleContext;
private final DBControl dbControl;
-
+ private final DBWriterHandler writerHandler;
+
+
public DBRecordsManagedService(BundleContext bundleContext,
PVDatabase master,
- PlcGeneralFunction generalFunction) {
+ PlcGeneralFunction generalFunction,
+ DBWriterHandler writerHandler) {
this.bundleContext = bundleContext;
+ this.master = master;
this.generalFunction = generalFunction;
- this.master = master;
+ this.writerHandler = writerHandler;
this.dbControl = null;
waitingConfigs = Collections.synchronizedMap(new HashMap<String, Dictionary<String, ?>>());
@@ -85,8 +101,8 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
/*
* All PvRecords are loaded from the configuration file and validated
- * against existing Devices.
- * If the Device does not exist, the PvRecords are not loaded and wait
+ * against existing PlcDevices.
+ * If the PlcDevice does not exist, the PvRecords are not loaded and wait
* for the device to be present.
* TODO: If the PlcItem associated with the PvRecord does not exist,
* it can be passed to a waiting queue.
@@ -99,8 +115,10 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
PVRecord record = null;
String device = null;
String strScalarType = null;
- List<PVRecord> pvRecords = new ArrayList();
+ List<DBRecord> dbRecords = new ArrayList();
String filename = (String) props.get("felix.fileinstall.filename");
+
+
if (props.size() < 3){
waitingConfigs.put(pid, props);
@@ -114,11 +132,11 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
device = filename.substring(start+1, end);
}
if (device==null){
- LOGGER.debug("Bad configuration name found: " + filename);
+ LOGGER.info("Bad configuration name found: " + filename);
return;
}
} else {
- LOGGER.debug("Configuration file name not found.");
+ LOGGER.info("Configuration file name not found.");
return;
}
@@ -126,7 +144,7 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
PlcDevice plcDevice = getDevice(device);
if (plcDevice == null){
- LOGGER.debug("Device driver [" + device + "] is not deployed.");
+ LOGGER.info("Device driver [" + device + "] is not deployed.");
waitingConfigs.put(device, props);
return;
}
@@ -134,13 +152,13 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
PlcConnection connPlc = plcDevice.getPlcConnection();
if (connPlc == null){
- LOGGER.debug("Device driver [" + device + "] native driver is not present.");
+ LOGGER.info("Device driver [" + device + "] native driver is not present.");
waitingConfigs.put(device, props);
return;
}
if(!connPlc.isConnected()){
- LOGGER.debug("Device driver [" + device + "] is not connected.");
+ LOGGER.info("Device driver [" + device + "] is not connected.");
waitingConfigs.put(device, props);
return;
}
@@ -166,28 +184,30 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
recordFactory = getRecordFactory(strScalarType);
if (recordFactory != null){
- PVRecord pvRecord = recordFactory.create(key.toString(), dataFields);
+ DBRecord dbRecord = recordFactory.create(key.toString(), dataFields);
- if (pvRecord != null){
- pvRecords.add(pvRecord);
+ if (dbRecord != null){
+ dbRecords.add(dbRecord);
} else {
LOGGER.info("PVRecord '" + key +"' could not be created.");
}
}
}
-
- //Si todo OK, los agregoa a la base de datos
- pvRecords.forEach(pvr -> {
-
+
+ //Si todo OK, los agregoa a la base de datos
+ LOGGER.info("Agrega la lista de Records...");
+ dbRecords.forEach(pvr -> {
PVStructure structure = pvr.getPVStructure();
PVBoolean pvScanEnable = structure.getBooleanField("scan_enable");
pvScanEnable.put(false);
- String id = structure.getStringField("id").get();
-
+ String id = structure.getStringField("id").get();
+ LOGGER.info("Agrega la lista de Records... {}",id);
Optional<PlcItem> plcItem = generalFunction.getPlcItem(id);
if (plcItem.isPresent()) {
plcItem.get().addItemListener((PlcItemListener) pvr);
master.addRecord(pvr);
+ LOGGER.info("Agreg un Record a la base de datos {}", pvr.getRecordName());
+ writerHandler.putDBRecord(pvr);
}
});
@@ -213,7 +233,7 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
try {
updated(pid,props);
} catch (ConfigurationException ex) {
- LOGGER.debug("Problem updating [" + key +"] from waiting list." );
+ LOGGER.info("Problem updating [" + key +"] from waiting list." );
}
}
}
@@ -242,10 +262,9 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
if (refDev == null) LOGGER.info("Device [" + device + "] don't found");
return refDev;
} catch (Exception ex){
- LOGGER.debug("getDriver: " + ex.toString());
+ LOGGER.info("getDriver: " + ex.toString());
}
return null;
}
-
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
index 547a21a..a48584d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -29,6 +29,7 @@ import org.epics.nt.NTScalarBuilder;
import org.epics.pvdata.factory.FieldFactory;
import org.epics.pvdata.pv.FieldBuilder;
import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVShort;
import org.epics.pvdata.pv.PVShortArray;
import org.epics.pvdata.pv.PVString;
@@ -42,7 +43,7 @@ public class DBShortFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
FieldBuilder fb = fieldCreate.createFieldBuilder();
@@ -59,12 +60,12 @@ public class DBShortFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBShortRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBShortRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName,int length) {
+ public DBRecord createArray(String recordName,int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
@@ -75,7 +76,8 @@ public class DBShortFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvShort, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -84,20 +86,20 @@ public class DBShortFactory extends DBBaseFactory {
PVShortArray pvValue = (PVShortArray) pvStructure.getScalarArrayField("value", ScalarType.pvShort);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBShortRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBShortRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBShortRecord extends PVRecord implements PlcItemListener {
+ class DBShortRecord extends DBRecord implements PlcItemListener {
private PVShort value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVShort write_value;
private int offset = 0;
public DBShortRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
value = pvStructure.getShortField("value");
+ write_value = pvStructure.getShortField("write_value");
}
/**
@@ -107,8 +109,14 @@ public class DBShortFactory extends DBBaseFactory {
public void process()
{
super.process();
- if (null != plcItem )
- plcItem.itemWrite();
+ if (null != plcItem) {
+ if (value.get() != write_value.get()) {
+ final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+ if (isWriteEnbale.get()) {
+ write_value.put(value.get());
+ }
+ }
+ }
}
@Override
@@ -130,6 +138,11 @@ public class DBShortFactory extends DBBaseFactory {
value.put(innerBuffer.getShort(0));
}
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
index eef316c..8692137 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
@@ -18,11 +18,11 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -41,7 +41,7 @@ public class DBStringFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvString).
@@ -56,12 +56,12 @@ public class DBStringFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBStringRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBStringRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +71,8 @@ public class DBStringFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvString, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -80,15 +81,15 @@ public class DBStringFactory extends DBBaseFactory {
PVStringArray pvValue = (PVStringArray) pvStructure.getScalarArrayField("value", ScalarType.pvString);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBStringRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBStringRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBStringRecord extends PVRecord implements PlcItemListener {
+ class DBStringRecord extends DBRecord implements PlcItemListener {
private PVString value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVString write_value;
+
private int offset = 0;
public DBStringRecord(String recordName,PVStructure pvStructure) {
@@ -104,7 +105,10 @@ public class DBStringFactory extends DBBaseFactory {
public void process()
{
super.process();
-
+ if (null != plcItem) {
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -124,6 +128,11 @@ public class DBStringFactory extends DBBaseFactory {
if (!value.get().matches(innerBuffer.toString(CharsetUtil.UTF_8)))
value.put( innerBuffer.toString(CharsetUtil.UTF_8) );
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
index 53cfe7d..11bf58a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBUByteFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvByte).
@@ -55,12 +55,12 @@ public class DBUByteFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBUByteRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUByteRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBUByteFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUByte, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -79,20 +80,21 @@ public class DBUByteFactory extends DBBaseFactory {
PVUByteArray pvValue = (PVUByteArray) pvStructure.getScalarArrayField("value", ScalarType.pvUByte);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBUByteRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUByteRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBUByteRecord extends PVRecord implements PlcItemListener {
+ class DBUByteRecord extends DBRecord implements PlcItemListener {
private PVUByte value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVUByte write_value;
+
private int offset = 0;
public DBUByteRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
value = (PVUByte) pvStructure.getByteField("value");
+ write_value = (PVUByte) pvStructure.getByteField("write_value");
}
/**
@@ -102,7 +104,11 @@ public class DBUByteFactory extends DBBaseFactory {
public void process()
{
super.process();
-
+ if (null != plcItem) {
+ System.out.println("Paso por UByte");
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -124,6 +130,11 @@ public class DBUByteFactory extends DBBaseFactory {
value.put((byte) innerBuffer.getUnsignedByte(offset));
}
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
index 54d2127..3235740 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBUIntFactory extends DBBaseFactory {
private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvUInt).
@@ -55,12 +55,12 @@ public class DBUIntFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBUIntRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUIntRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,6 +71,7 @@ public class DBUIntFactory extends DBBaseFactory {
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUInt, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -79,20 +80,21 @@ public class DBUIntFactory extends DBBaseFactory {
PVUIntArray pvValue = (PVUIntArray) pvStructure.getScalarArrayField("value", ScalarType.pvUInt);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBUIntRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUIntRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBUIntRecord extends PVRecord implements PlcItemListener {
+ class DBUIntRecord extends DBRecord implements PlcItemListener {
private PVUInt value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVUInt write_value;
+
private int offset = 0;
public DBUIntRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = (PVUInt) pvStructure.getIntField("value");
+ value = (PVUInt) pvStructure.getIntField("value");
+ write_value = (PVUInt) pvStructure.getIntField("write_value");
}
/**
@@ -102,7 +104,11 @@ public class DBUIntFactory extends DBBaseFactory {
public void process()
{
super.process();
-
+ if (null != plcItem) {
+ System.out.println("Paso por UInt");
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -123,6 +129,11 @@ public class DBUIntFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getUnsignedInt(offset))
value.put((byte) innerBuffer.getUnsignedInt(offset));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
index 6d191f5..4384d6d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -42,7 +42,7 @@ public class DBULongFactory extends DBBaseFactory {
public DBULongFactory() {}
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvULong).
@@ -57,12 +57,12 @@ public class DBULongFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBULongRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBULongRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -72,7 +72,8 @@ public class DBULongFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvULong, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -81,20 +82,21 @@ public class DBULongFactory extends DBBaseFactory {
PVULongArray pvValue = (PVULongArray) pvStructure.getScalarArrayField("value", ScalarType.pvULong);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBULongRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBULongRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBULongRecord extends PVRecord implements PlcItemListener {
+ class DBULongRecord extends DBRecord implements PlcItemListener {
private PVULong value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVULong write_value;
+
private int offset = 0;
DBULongRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = (PVULong) pvStructure.getLongField("value");
+ value = (PVULong) pvStructure.getLongField("value");
+ write_value = (PVULong) pvStructure.getLongField("write_value");
}
/**
@@ -104,7 +106,10 @@ public class DBULongFactory extends DBBaseFactory {
public void process()
{
super.process();
-
+ if (null != plcItem) {
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -125,6 +130,12 @@ public class DBULongFactory extends DBBaseFactory {
if (value.get() != innerBuffer.getUnsignedMedium(offset))
value.put(innerBuffer.getUnsignedMedium(offset));
}
+
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
+
}
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
index 8d31755..32a4643 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
@@ -18,10 +18,10 @@
*/
package org.apache.plc4x.merlot.db.core;
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
@@ -42,7 +42,7 @@ public class DBUShortFactory extends DBBaseFactory {
public DBUShortFactory() {}
@Override
- public PVRecord create(String recordName) {
+ public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
PVStructure pvStructure = ntScalarBuilder.
value(ScalarType.pvUShort).
@@ -57,12 +57,12 @@ public class DBUShortFactory extends DBBaseFactory {
addDisplay().
addControl().
createPVStructure();
- PVRecord pvRecord = new DBUShortRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUShortRecord(recordName,pvStructure);
+ return dbRecord;
}
@Override
- public PVRecord createArray(String recordName, int length) {
+ public DBRecord createArray(String recordName, int length) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
PVStructure pvStructure = ntScalarArrayBuilder.
@@ -72,7 +72,8 @@ public class DBUShortFactory extends DBBaseFactory {
add("offset", fieldCreate.createScalar(ScalarType.pvInt)).
add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUShort, length)).
addAlarm().
addTimeStamp().
addDisplay().
@@ -81,20 +82,21 @@ public class DBUShortFactory extends DBBaseFactory {
PVUShortArray pvValue = (PVUShortArray) pvStructure.getScalarArrayField("value", ScalarType.pvUShort);
pvValue.setCapacity(length);
pvValue.setLength(length);
- PVRecord pvRecord = new DBUShortRecord(recordName,pvStructure);
- return pvRecord;
+ DBRecord dbRecord = new DBUShortRecord(recordName,pvStructure);
+ return dbRecord;
}
- class DBUShortRecord extends PVRecord implements PlcItemListener{
+ class DBUShortRecord extends DBRecord implements PlcItemListener{
private PVUShort value;
- private PlcItem plcItem = null;
- private ByteBuf innerBuffer = null;
+ private PVUShort write_value;
+
private int offset = 0;
private DBUShortRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = (PVUShort) pvStructure.getShortField("value");
+ value = (PVUShort) pvStructure.getShortField("value");
+ write_value = (PVUShort) pvStructure.getShortField("write_value");
}
/**
@@ -104,8 +106,11 @@ public class DBUShortFactory extends DBBaseFactory {
public void process()
{
super.process();
- if (null != plcItem )
- plcItem.itemWrite();
+ if (null != plcItem) {
+ System.out.println("Paso por UShort");
+ if (value.get() != write_value.get())
+ write_value.put(value.get());
+ }
}
@Override
@@ -127,8 +132,10 @@ public class DBUShortFactory extends DBBaseFactory {
value.put( (short) innerBuffer.getUnsignedShort(offset));
}
-
-
+ @Override
+ public String getFieldsToMonitor() {
+ return MONITOR_WRITE_FIELD;
+ }
}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
new file mode 100644
index 0000000..60b8bd8
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.merlot.db.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.api.DBWriterHandler;
+import org.epics.pvdata.copy.CreateRequest;
+import org.epics.pvdata.misc.BitSet;
+import org.epics.pvdata.monitor.Monitor;
+import org.epics.pvdata.monitor.MonitorElement;
+import org.epics.pvdata.pv.MessageType;
+import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdata.pv.Status;
+import org.epics.pvdata.pv.Structure;
+import org.epics.pvdatabase.pva.MonitorFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+* This service is responsible for calling the writing of a PvRecord through
+* the associated PlcItem.
+*/
+public class DBWriterHandlerImpl implements DBWriterHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(DBWriterHandlerImpl.class);
+ private CreateRequest createRequest = CreateRequest.create();
+ private Map<Monitor, DBRecord> recordMonitors = new HashMap<>();
+
+ private MonitorElement element = null;
+ private PVStructure structure = null;
+ private BitSet changedBitSet = null;
+ private BitSet overrunBitSet = null;
+
+ @Override
+ public void monitorConnect(Status status, Monitor monitor, Structure structure) {
+
+ }
+
+ @Override
+ public void monitorEvent(Monitor monitor) {
+ try
+ {
+ element = monitor.poll();
+ structure = element.getPVStructure();
+ changedBitSet = element.getChangedBitSet();
+ overrunBitSet = element.getOverrunBitSet();
+
+ if ((recordMonitors.containsKey(monitor)) &&
+ structure.getBooleanField("write_enable").get()) {
+ if (changedBitSet.get(1) &&
+ (changedBitSet.length() == 2) &&
+ overrunBitSet.isEmpty()) {
+
+ final DBRecord dbRecord = recordMonitors.get(monitor);
+ final Optional<PlcItem> refPlcItem = dbRecord.getPlcItem();
+
+ refPlcItem.get().itemWrite(dbRecord.getWriteBuffer().get(), dbRecord.getOffset());
+
+ }
+ }
+ } catch (Exception ex) {
+ LOGGER.info(ex.getMessage());
+ } finally {
+ monitor.release(element);
+ }
+ }
+
+
+ @Override
+ public void unlisten(Monitor monitor) {
+ recordMonitors.remove(monitor);
+ }
+
+ @Override
+ public String getRequesterName() {
+ return "getRequesterName()";
+ }
+
+ @Override
+ public void message(String message, MessageType messageType) {
+
+ }
+
+ @Override
+ public void putDBRecord(DBRecord dbRecord) {
+ LOGGER.debug("Monitor with fields = {}", dbRecord.getFieldsToMonitor());
+ PVStructure request = createRequest.createRequest(dbRecord.getFieldsToMonitor());
+ Monitor monitor = MonitorFactory.create(dbRecord, this, request);
+ recordMonitors.put(monitor, dbRecord);
+ monitor.start();
+ }
+
+ @Override
+ public void removeDBRecord(DBRecord dbRecord) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
index dd492f5..cf9d78a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
@@ -53,13 +53,16 @@
scope="singleton">
<property name="bundleContext" ref="blueprintBundleContext"/>
</bean>
+
+ <bean id="DBWriterHandlerImpl" class="org.apache.plc4x.merlot.db.impl.DBWriterHandlerImpl"/>
<bean id="DBRecordsManagedService"
class="org.apache.plc4x.merlot.db.core.DBRecordsManagedService"
scope="singleton">
<argument ref="blueprintBundleContext" />
<argument ref="DBBean" />
- <argument ref="refPlcGeneralFunction" />
+ <argument ref="refPlcGeneralFunction" />
+ <argument ref="DBWriterHandlerImpl" />
</bean>
<bean id="DBRPCReferenceListener"
@@ -197,6 +200,8 @@
ref="DBChannelProvider"
interface="org.epics.pvaccess.client.ChannelProvider"/>
+ <service ref="DBWriterHandlerImpl" interface="org.apache.plc4x.merlot.db.api.DBWriterHandler" />
+
<!-- <service id="MasterDBControl" ref="DBControl" auto-export="interfaces">
<service-properties>
<entry key="scheduler.name" value="MasterDBControl"/>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
similarity index 72%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
index dd7f1ce..105aeee 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
@@ -21,31 +21,31 @@
<modelVersion>4.0.0</modelVersion>
<parent>
- <artifactId>merlot</artifactId>
- <groupId>org.apache.plc4x</groupId>
- <version>0.13.0-SNAPSHOT</version>
- </parent>
+ <artifactId>merlot</artifactId>
+ <groupId>org.apache.plc4x</groupId>
+ <version>0.13.0-SNAPSHOT</version>
+ </parent>
- <groupId>org.apache.plc4x.merlot.drv.simulated</groupId>
- <artifactId>org.apache.plc4x.merlot.drv.simulated</artifactId>
+ <groupId>org.apache.plc4x.merlot.drv.mb</groupId>
+ <artifactId>org.apache.plc4x.merlot.drv.mb</artifactId>
<version>0.13.0-SNAPSHOT</version>
<packaging>bundle</packaging>
- <name>PLC4J: Merlot :: sim :: Simulated driver</name>
- <description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
+ <name>PLC4J: Merlot :: mb :: Support for Plc4x Modbus driver</name>
+ <description>org.apache.plc4x.merlot.drv.mb OSGi blueprint bundle project.</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>5.1.8</version>
+ <version>5.1.9</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
- <Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
- <Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
+ <Bundle-Version>${project.version}</Bundle-Version>
+ <Export-Package>org.apache.plc4x.merlot.drv.mb*;version=${project.version}</Export-Package>
<Import-Package>*</Import-Package>
</instructions>
</configuration>
@@ -63,13 +63,8 @@
</build>
<dependencies>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.plc4x.merlot.das.base</groupId>
- <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
+ <groupId>org.apache.plc4x.merlot.api</groupId>
+ <artifactId>org.apache.plc4x.merlot.api</artifactId>
<version>0.13.0-SNAPSHOT</version>
</dependency>
</dependencies>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java
new file mode 100644
index 0000000..bc40aa6
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.api;
+
+public interface MyService {
+
+ public String echo(String message);
+
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java
new file mode 100644
index 0000000..a71cef1
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.api;
+
+public class MyServiceImpl implements MyService {
+
+ public String echo(String message) {
+ return "Echo processed: " + message;
+ }
+
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java
new file mode 100644
index 0000000..0f7a0d1
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+
+
+public class ModbusPlcTagFunctionImpl implements PlcTagFunction {
+
+ @Override
+ public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public PropertyMetadata getPropertyMetadata(String propertyName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public OperationMetadata getOperationMetadata(String operationName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Object getServiceProperty(String propKey) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public String[] getServicePropertyKeys() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml
new file mode 100644
index 0000000..1150d95
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+ <bean id="serviceBean" class="org.apache.plc4x.merlot.drv.mb.MyServiceImpl"/>
+
+ <service ref="serviceBean" interface="org.apache.plc4x.merlot.drv.mb.MyService"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
similarity index 72%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
index dd7f1ce..db2ea47 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
@@ -21,31 +21,31 @@
<modelVersion>4.0.0</modelVersion>
<parent>
- <artifactId>merlot</artifactId>
- <groupId>org.apache.plc4x</groupId>
- <version>0.13.0-SNAPSHOT</version>
- </parent>
+ <artifactId>merlot</artifactId>
+ <groupId>org.apache.plc4x</groupId>
+ <version>0.13.0-SNAPSHOT</version>
+ </parent>
- <groupId>org.apache.plc4x.merlot.drv.simulated</groupId>
- <artifactId>org.apache.plc4x.merlot.drv.simulated</artifactId>
+ <groupId>org.apache.plc4x.merlot.drv.s7</groupId>
+ <artifactId>org.apache.plc4x.merlot.drv.s7</artifactId>
<version>0.13.0-SNAPSHOT</version>
<packaging>bundle</packaging>
- <name>PLC4J: Merlot :: sim :: Simulated driver</name>
- <description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
+ <name>PLC4J: Merlot :: s7 :: Support for Plc4x S7 driver</name>
+ <description>org.apache.plc4x.merlot.drv.s7 OSGi blueprint bundle project.</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>5.1.8</version>
+ <version>5.1.9</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
- <Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
- <Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
+ <Bundle-Version>${project.version}</Bundle-Version>
+ <Export-Package>org.apache.plc4x.merlot.drv.s7*;version=${project.version}</Export-Package>
<Import-Package>*</Import-Package>
</instructions>
</configuration>
@@ -63,13 +63,8 @@
</build>
<dependencies>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.plc4x.merlot.das.base</groupId>
- <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
+ <groupId>org.apache.plc4x.merlot.api</groupId>
+ <artifactId>org.apache.plc4x.merlot.api</artifactId>
<version>0.13.0-SNAPSHOT</version>
</dependency>
</dependencies>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java
new file mode 100644
index 0000000..29e4369
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.api;
+
+public interface MyService {
+
+ public String echo(String message);
+
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java
new file mode 100644
index 0000000..18b15da
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.api;
+
+public class MyServiceImpl implements MyService {
+
+ public String echo(String message) {
+ return "Echo processed: " + message;
+ }
+
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
new file mode 100644
index 0000000..af38649
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+
+
+public class S7PlcTagFunctionImpl implements PlcTagFunction {
+
+ @Override
+ public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public PropertyMetadata getPropertyMetadata(String propertyName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public OperationMetadata getOperationMetadata(String operationName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Object getServiceProperty(String propKey) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public String[] getServicePropertyKeys() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
similarity index 52%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
index 89db26d..d3ef1f6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
@@ -15,33 +15,29 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="eager">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
-<!-- <bean id="serviceBean" class="org.apache.plc4x.merlot.drv.simulated.MyServiceImpl"/>
-
- <service ref="serviceBean" interface="org.apache.plc4x.merlot.drv.simulated.MyService"/>-->
-
- <reference id="serviceEventAdmin"
- interface="org.osgi.service.event.EventAdmin">
- </reference>
-
- <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
- <argument ref="blueprintBundleContext"/>
- <argument ref="serviceEventAdmin"/>
- </bean>
-
- <reference id="servicePLC4XSimulated"
+ <reference id="S7Plc4xDriverRef"
interface="org.apache.plc4x.java.api.PlcDriver"
- filter="(org.apache.plc4x.driver.code=simulated)"
+ filter="(org.apache.plc4x.driver.code=s7)"
timeout="10000"
availability="mandatory">
- <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />
- </reference>
+<!-- <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />-->
+ </reference>
- <service ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
+
+ <bean id="S7PlcTagFunctionBean" class="org.apache.plc4x.merlot.drv.s7.impl.S7PlcTagFunctionImpl" scope="singleton">
+ <argument ref="blueprintBundleContext"/>
+ </bean>
+
+ <service ranking="0" ref="S7PlcTagFunctionBean" interface="org.osgi.service.device.Driver">
<service-properties>
- <entry key="DRIVER_ID" value="org.apache.plc4x.simulated"/>
+ <entry key="dal.function.UID" value="org.apache.plc4x.s7"/>
+ <entry key="dal.function.device.UID" value="s7"/>
+ <entry key="dal.function.description" value="Generated write tag for s7driver."/>
+ <entry key="dal.function.version" value="org.apache.plc4x.s7"/>
+ <entry key="dal.function.type" value=""/>
</service-properties>
- </service>
+ </service>
</blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
index dd7f1ce..dbd1d7e 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
@@ -31,7 +31,7 @@
<version>0.13.0-SNAPSHOT</version>
<packaging>bundle</packaging>
- <name>PLC4J: Merlot :: sim :: Simulated driver</name>
+ <name>PLC4J: Merlot :: sim :: Support for Plc4x Simulated driver</name>
<description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
<build>
@@ -47,6 +47,7 @@
<Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
<Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
<Import-Package>*</Import-Package>
+ <_removeheaders>Import-Service,Export-Service</_removeheaders>
</instructions>
</configuration>
</plugin>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java
new file mode 100644
index 0000000..eff3e7a
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.simulated.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import static org.apache.plc4x.java.api.types.PlcValueType.BOOL;
+import static org.apache.plc4x.java.api.types.PlcValueType.BYTE;
+import org.apache.plc4x.java.simulated.tag.SimulatedTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class SimulatedPlcTagFunctionImpl implements PlcTagFunction {
+ private static final Logger LOGGER = LoggerFactory.getLogger(SimulatedPlcTagFunctionImpl.class);
+ private BundleContext bc;
+
+ public SimulatedPlcTagFunctionImpl(BundleContext bc) {
+ this.bc = bc;
+ }
+
+ /*
+ *
+ */
+ @Override
+ public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+ LOGGER.info("PlcTag class {} and type {} ", plcTag.getClass(), plcTag.getPlcValueType());
+ short tempValue = 0;
+ if (plcTag instanceof SimulatedTag){
+ final SimulatedTag simTag = (SimulatedTag) plcTag;
+ LOGGER.info("Processing SimulatedTag: {}", simTag.toString());
+ Object[] objValues = new Object[byteBuf.capacity()];
+ StringBuilder strTagBuilder = new StringBuilder();
+ switch (simTag.getPlcValueType()) {
+ case BOOL:
+ strTagBuilder.append("STDOUT/").
+ append("merlot").
+ append(":BOOL[").
+ append(byteBuf.capacity()).
+ append("]");
+ byteBuf.resetReaderIndex();
+ for (int i=0; i < byteBuf.capacity(); i++){
+ objValues[i] = byteBuf.readBoolean();
+ }
+ break;
+ case BYTE:
+ strTagBuilder.append("STDOUT/").
+ append("merlot").
+ append(":BYTE[").
+ append(byteBuf.capacity()).
+ append("]");
+ byteBuf.resetReaderIndex();
+ for (int i=0; i < byteBuf.capacity(); i++){
+ tempValue = (short) (byteBuf.readByte() & 0xFF);
+ objValues[i] = tempValue;
+ }
+ break;
+ default:;
+ }
+ LOGGER.info("Writing tag : {}",strTagBuilder.toString() );
+ return new ImmutablePair<>(strTagBuilder.toString(), objValues);
+ }
+ return null;
+ }
+
+ @Override
+ public PropertyMetadata getPropertyMetadata(String propertyName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public OperationMetadata getOperationMetadata(String operationName) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Object getServiceProperty(String propKey) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public String[] getServicePropertyKeys() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+
+
+
+
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
index 89db26d..6cfb9e2 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
@@ -25,23 +25,37 @@
interface="org.osgi.service.event.EventAdmin">
</reference>
- <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
+<!-- <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
<argument ref="blueprintBundleContext"/>
<argument ref="serviceEventAdmin"/>
- </bean>
+ </bean> -->
+
+ <bean id="SimPlcTagFunction" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedPlcTagFunctionImpl" scope="singleton">
+ <argument ref="blueprintBundleContext"/>
+ </bean>
<reference id="servicePLC4XSimulated"
interface="org.apache.plc4x.java.api.PlcDriver"
filter="(org.apache.plc4x.driver.code=simulated)"
timeout="10000"
availability="mandatory">
- <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />
+<!-- <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />-->
</reference>
- <service ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
+<!-- <service ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
<service-properties>
<entry key="DRIVER_ID" value="org.apache.plc4x.simulated"/>
</service-properties>
- </service>
+ </service> -->
+
+ <service ranking="0" ref="SimPlcTagFunction" auto-export="interfaces">
+ <service-properties>
+ <entry key="dal.function.UID" value="org.apache.plc4x.simulated"/>
+ <entry key="dal.function.device.UID" value="simulated"/>
+ <entry key="dal.function.description" value="Generated write tag for simulated driver."/>
+ <entry key="dal.function.version" value="org.apache.plc4x.simulated"/>
+ <entry key="dal.function.type" value=""/>
+ </service-properties>
+ </service>
</blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
index 2106da1..2a3a3f3 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
@@ -93,7 +93,10 @@
<bundle start-level="30">mvn:org.apache.plc4x/plc4j-utils-raw-sockets/${project.version}</bundle>
<!-- Plc4x - Default driver implementation -->
- <bundle start-level="32">mvn:org.apache.plc4x/plc4j-driver-simulated/${project.version}</bundle>
+ <bundle start-level="32">mvn:org.apache.plc4x/plc4j-driver-simulated/${project.version}</bundle>
+
+ <!-- Plc4x - Support services for Plc4x driver implementation -->
+ <bundle start-level="32">mvn:org.apache.plc4x.merlot.drv.simulated/org.apache.plc4x.merlot.drv.simulated/${project.version}</bundle>
<!-- Plc4x-Merlot-Core>
1. Driver packages must have a "start-level" greater than 40.
diff --git a/plc4j/tools/merlot/pom.xml b/plc4j/tools/merlot/pom.xml
index 42fdd9b..6fac475 100644
--- a/plc4j/tools/merlot/pom.xml
+++ b/plc4j/tools/merlot/pom.xml
@@ -17,123 +17,322 @@ KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
+
+
+
<modelVersion>4.0.0</modelVersion>
-
+
+
+
<!-- <parent>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-integrations</artifactId>
<version>0.13.0-SNAPSHOT</version>
</parent>-->
-
+
+
+
<groupId>org.apache.plc4x</groupId>
+
+
<artifactId>merlot</artifactId>
+
+
<version>0.13.0-SNAPSHOT</version>
+
+
<packaging>pom</packaging>
-
- <name>PLC4J: Integrations: Apache Karaf</name>
+
+
+
+ <name>PLC4J: Integrations: Apache Karaf</name>
+
+
+
<description>Integration module for integrating PLC4X into Apache Karaf.</description>
-
+
+
+
<properties>
-
+
+
+
<!-- Inherited -->
-
+
+
+
<plc4x.version>0.13.0-SNAPSHOT</plc4x.version>
+
+
<apache.log4j.version>2.20.0</apache.log4j.version>
+
+
<bit-io.version>1.4.3</bit-io.version>
+
+
<c3p0.version>0.9.5.5</c3p0.version>
+
+
<commons-codec.version>1.17.1</commons-codec.version>
+
+
<commons-net.version>3.11.1</commons-net.version>
+
+
<commons-lang3.version>3.16.0</commons-lang3.version>
+
+
<hikaricp.version>2.7.9</hikaricp.version>
+
+
<netty.version>4.1.104.Final</netty.version>
+
+
<quartz.version>2.3.2</quartz.version>
+
+
<slf4j.version>2.0.3</slf4j.version>
+
+
<spifly.version>1.3.6</spifly.version>
+
+
<jackson.version>2.16.1</jackson.version>
+
+
<jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
+
+
<parser-ng.version>0.1.8</parser-ng.version>
+
+
<vavr.version>0.10.4</vavr.version>
+
+
<logback.version>1.5.3</logback.version>
- <aries.spifly.version>1.3.7</aries.spifly.version>
- <asm.version>9.6</asm.version>
+
+ <aries.spifly.version>1.3.7</aries.spifly.version>
+
+
+
+ <asm.version>9.6</asm.version>
+
+
+
<!-- Database used in Pax-jdbc -->
+
+
<derby.version>10.14.2.0</derby.version>
+
+
<h2.version>2.1.210</h2.version>
-
+
+
<!-- Remove GPL licence -->
+
+
<javaluator.version>3.0.3</javaluator.version>
-
+
+
+
<!-- Integration version -->
+
+
<karaf.version>4.4.6</karaf.version>
- <decanter.version>2.10.0</decanter.version>
+
+
+ <decanter.version>2.10.0</decanter.version>
+
+
+
<org.osgi.core.version>6.0.0</org.osgi.core.version>
+
+
<osgi.core.version>8.0.0</osgi.core.version>
+
+
<osgi.cmpn.version>7.0.0</osgi.cmpn.version>
+
+
<osgi.device.version>1.1.0</osgi.device.version>
+
+
<org.osgi.dal.version>1.0.2</org.osgi.dal.version>
+
+
<disruptor.version>4.0.0</disruptor.version>
+
+
<!-- EPICS -->
+
+
<epics.core.version>7.0.9</epics.core.version>
+
+
<epics.util.version>1.0.6</epics.util.version>
+
+
<epics.vtype.version>1.0.6</epics.vtype.version>
+
+
<epics.vtype.all.version>1.0.6</epics.vtype.all.version>
+
+
<epics.ntypes.version>0.3.8</epics.ntypes.version>
+
+
<epics.jca.version>2.4.8</epics.jca.version>
+
+
<epics.pvaccess.version>5.1.8</epics.pvaccess.version>
+
+
<epics.pvaclient.version>4.3.2</epics.pvaclient.version>
+
+
<epics.pvdata.version>6.1.8</epics.pvdata.version>
+
+
<epics.pvdatabase.version>4.3.1</epics.pvdatabase.version>
+
+
<epics.gpclient.version>1.0.7</epics.gpclient.version>
+
+
<epics.gpclient.core.version>1.0.7</epics.gpclient.core.version>
+
+
<epics.gpclient.sim.version>1.0.7</epics.gpclient.sim.version>
+
+
<epics.gpclient.loc.version>1.0.7</epics.gpclient.loc.version>
+
+
<epics.gpclient.pva.version>1.0.7</epics.gpclient.pva.version>
+
+
<epics.gpclient.ca.version>1.0.7</epics.gpclient.ca.version>
+
+
<!-- GRPC Service -->
+
+
<protobuf.version>3.25.3</protobuf.version>
+
+
<proto.google.commons.version>2.29.0</proto.google.commons.version>
+
+
<grpc.version>1.62.2</grpc.version>
+
+
<guava.android.version>32.1.3-android</guava.android.version>
+
+
<errorprone.version>2.23.0</errorprone.version>
+
+
<annotations.api.version>6.0.53</annotations.api.version>
+
+
<failureaccess.version>1.0.1</failureaccess.version>
+
+
<j2objc.version>2.8</j2objc.version>
+
+
<jsr305.version>3.0.2</jsr305.version>
+
+
<okio.version>3.9.0</okio.version>
+
+
<tomcat.annotation.version>6.0.53</tomcat.annotation.version>
+
+
<annotation.version>13.0</annotation.version>
+
+
<kotlin.version>1.9.21</kotlin.version>
+
+
</properties>
-
+
+
<modules>
+
+
<module>org.apache.plc4x.merlot.modbus.dev</module>
+
+
<module>org.apache.plc4x.merlot.modbus.svr</module>
+
+
<module>org.apache.plc4x.merlot.scheduler</module>
+
+
<module>org.apache.plc4x.merlot.branding</module>
+
+
<module>org.apache.plc4x.merlot.uns</module>
+
+
<module>org.apache.plc4x.merlot.features</module>
+
+
<module>org.apache.plc4x.merlot.das</module>
+
+
<module>org.apache.plc4x.merlot.modbus.sim</module>
+
+
<module>org.apache.plc4x.merlot.db</module>
+
+
<module>org.apache.plc4x.merlot.das.api</module>
+
+
<module>org.apache.plc4x.merlot.derby</module>
+
+
<module>org.apache.plc4x.merlot.h2</module>
+
+
<module>org.apache.plc4x.merlot.drv.simulated</module>
+
+
<module>org.apache.plc4x.merlot.das.ref</module>
+
+
<module>org.apache.plc4x.merlot.das.base</module>
- <module>org.apache.plc4x.merlot.grpc</module>
+
+
+ <module>org.apache.plc4x.merlot.grpc</module>
+
+
+
<module>org.apache.plc4x.merlot.ui</module>
- <module>org.apache.plc4x.merlot</module>
+
+
+ <module>org.apache.plc4x.merlot</module>
+
+
+
+ <module>org.apache.plc4x.merlot.drv.s7</module>
+
+
+ <module>org.apache.plc4x.merlot.drv.mb</module>
+
</modules>
+
</project>