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 2b4cc65  Adds driver status quality support to DBRecords. Adds support 
for S7 counters.
2b4cc65 is described below

commit 2b4cc65796657f79e04ab6b4b3a1c16d419f6974
Author: César García <[email protected]>
AuthorDate: Mon Oct 28 08:49:46 2024 -0400

    Adds driver status quality support to DBRecords. Adds support for S7 
counters.
---
 .../merlot/org.apache.plc4x.merlot.das.api/pom.xml |   5 +
 .../java/org/apache/plc4x/merlot/api/PlcItem.java  |   7 +
 .../apache/plc4x/merlot/api/PlcItemListener.java   |   4 +
 .../plc4x/merlot/api/command/DemoCommand004.java   |  17 +-
 .../plc4x/merlot/api/impl/PlcDeviceImpl.java       |   7 +-
 .../apache/plc4x/merlot/api/impl/PlcGroupImpl.java |  33 +
 .../apache/plc4x/merlot/api/impl/PlcItemImpl.java  |  22 +-
 .../merlot/org.apache.plc4x.merlot.db/pom.xml      |   6 -
 .../org/apache/plc4x/merlot/db/api/DBRecord.java   |  41 +-
 .../plc4x/merlot/db/core/DBBooleanFactory.java     |   8 +-
 .../plc4x/merlot/db/impl/DBCollectorImpl.java      | 738 ---------------------
 .../apache/plc4x/merlot/db/impl/DBControlImpl.java | 106 ---
 .../resources/OSGI-INF/blueprint/db-service.xml    |   4 +-
 .../merlot/org.apache.plc4x.merlot.drv.s7/pom.xml  |   5 +
 .../merlot/drv/s7/core/DBS7CounterFactory.java}    | 128 ++--
 .../OSGI-INF/blueprint/s7-drv-service.xml          |  13 +-
 16 files changed, 212 insertions(+), 932 deletions(-)

diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
index 1c087f8..5042c9d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
@@ -208,5 +208,10 @@
             <artifactId>sqlite-jdbc</artifactId>
             <version>3.46.1.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.epics</groupId>
+            <artifactId>epics-pvdata</artifactId>
+            <version>${epics.pvdata.version}</version>
+        </dependency>
     </dependencies>
 </project>
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 89a8c2b..c37edfb 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
@@ -29,6 +29,8 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.merlot.api.impl.PlcDeviceWriteEvent;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 
 public interface PlcItem {
     
@@ -224,4 +226,9 @@ public interface PlcItem {
     */    
     public void itemWrite(final ByteBuf byteBuf, int byteOffset, byte 
bitOffset);
     
+    /*
+    *
+    */
+    public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus, 
String alrmMsg);
+    
 }
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
index 909c8eb..caeffc1 100644
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
+++ 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
@@ -19,6 +19,8 @@
 package org.apache.plc4x.merlot.api;
 
 import io.netty.buffer.ByteBuf;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 
 
 public interface PlcItemListener {
@@ -29,4 +31,6 @@ public interface PlcItemListener {
     
     void update();
     
+    public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus, 
String alrmMsg);    
+    
 }
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
index 31d9e11..e90a0eb 100644
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
+++ 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
@@ -122,7 +122,22 @@ public class DemoCommand004  implements Action  {
                         optPlcItem.get().enable();
                         
System.out.println(optPlcItem.get().getItemUid().toString()+ " : " + 
optPlcItem.get().getItemName());
                     }                                                          
  
-                }           
+                }    
+                
+                for (int i= 1; i < 10; i++) {
+                    Optional<PlcItem> optPlcItem = 
plcGeneralFunction.createItem(UUID.randomUUID().toString(), 
+                            optPlcGroup.get().getGroupUid().toString(),
+                            optPlcDevice.get().getUid().toString(),
+                            "S7COUNTERS_" + i,
+                            "Item description _" + i,
+                            "%C0:COUNTER[20]",
+                            "true");
+                    if (optPlcItem.isPresent()){
+                        optPlcItem.get().enable();
+                        
System.out.println(optPlcItem.get().getItemUid().toString()+ " : " + 
optPlcItem.get().getItemName());
+                    }                                                          
  
+                }                    
+                
 
             }
         }
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 b92e4d3..07fd60b 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
@@ -57,6 +57,8 @@ import org.apache.plc4x.merlot.api.PlcTagFunction;
 import org.apache.plc4x.merlot.scheduler.api.Job;
 import org.apache.plc4x.merlot.scheduler.api.JobContext;
 import org.apache.plc4x.merlot.scheduler.api.Scheduler;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
@@ -183,17 +185,20 @@ public class PlcDeviceImpl implements PlcDevice {
                                 try {        
                                     final PlcReadResponse syncResponse = 
readRequest.execute().get();
                                         
event.getPlcGroup().getGroupItems().forEach((u,i) -> {
+                                            
                                         final PlcValue plcValue = 
syncResponse.getPlcValue(i.getItemName());
                                         if (null == plcValue) {
                                             LOGGER.debug("Item[{}] = {} ", 
i.getItemName(),"Null value");
+                                            i.setStaus(AlarmSeverity.MAJOR, 
AlarmStatus.DEVICE, "The DEVICE don't return value.");                          
                     
                                         } else {
                                             LOGGER.debug("Item[{}]  Read ", 
i.getItemName());
                                             i.setPlcValue(plcValue);
                                         }
+                                        
                                     });
 
                                 } catch (Exception ex) {
-                                    LOGGER.error("Read ringbuffer: " + 
ex.getMessage());
+                                    LOGGER.error("Read ringbuffer: " + 
ex.getMessage());                 
                                 }                                
                                 watch.stop();
                                 LOGGER.debug("Elapse time Group[{}] time: 
{}",event.getPlcGroup().getGroupName(), watch.getTime());
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 5dec6e1..e2e3199 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
@@ -36,6 +36,8 @@ import org.osgi.framework.BundleContext;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcGroup;
 import org.apache.plc4x.merlot.api.core.PlcItemClientService;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 import org.osgi.framework.ServiceReference;
 import org.slf4j.LoggerFactory;
 
@@ -53,6 +55,7 @@ public class PlcGroupImpl implements PlcGroup, Job {
         
     private boolean enable = false;
     private boolean isFirtsRun = true;
+    private boolean updateItemStatus = false;
        
     private long groupTransmit = 0;
     private long groupReceives = 0;    
@@ -258,27 +261,57 @@ public class PlcGroupImpl implements PlcGroup, Job {
                             Optional<PlcTag> refPlcTag = 
refPlcConnection.get().parseTagAddress(i.getItemId());
                             if (refPlcTag.isPresent()) {
                                 i.setItemPlcTag(refPlcTag.get());
+                                i.setStaus(AlarmSeverity.NONE, 
AlarmStatus.NONE, "");
                             } else {
                                 i.disable();
+                                i.setStaus(AlarmSeverity.MAJOR, 
AlarmStatus.CONF, "Tag incorrect.");                                
                             }
                         });
                         isFirtsRun = false;
+                        updateItemStatus = true;                          
                     }
                     //executeReadAllItems();
+                    if (!isFirtsRun && !updateItemStatus) {
+                         groupItems.forEach((u,i) -> {
+                            if (i.isEnable())
+                                i.setStaus(AlarmSeverity.NONE, 
AlarmStatus.NONE, "");               
+                         }); 
+                        updateItemStatus = true;                     
+                    };                    
                     long sequenceId = readRingBuffer.next();
                     final PlcDeviceReadEvent readEvent = 
readRingBuffer.get(sequenceId);
                     readEvent.setPlcGroup(this);
                     readRingBuffer.publish(sequenceId);
                 } else {
                     LOGGER.info("The driver is disconnected.");
+                    if (updateItemStatus) {
+                         groupItems.forEach((u,i) -> {
+                            if (i.isEnable())
+                                i.setStaus(AlarmSeverity.MAJOR, 
AlarmStatus.DRIVER, "Driver is disconnected.");                
+                         }); 
+                        updateItemStatus = false;                     
+                    };                    
                 }
             } else {
                 LOGGER.info("Unassigned or null PlcConnection connection.");
+                if (updateItemStatus) {
+                     groupItems.forEach((u,i) -> {
+                        i.setStaus(AlarmSeverity.MAJOR, AlarmStatus.DRIVER, 
"Driver don't exist.");                
+                     }); 
+                    updateItemStatus = false;                     
+                };
             }
         } else {
             LOGGER.info("The group {}:{} is disable.", 
                     ((String) groupProperties.get(PlcGroup.GROUP_NAME)),
                     ((String) groupProperties.get(PlcGroup.GROUP_UID)));
+            if (updateItemStatus) {
+                groupItems.forEach((u,i) -> {
+                    if (i.isEnable())
+                        i.setStaus(AlarmSeverity.MAJOR, AlarmStatus.CONF, 
"Group ["+ groupProperties.get(PlcGroup.GROUP_NAME)+"] is disable.");           
     
+                });
+                updateItemStatus = false;
+            }
         }
     }
 
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 bff0b88..46e09fa 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
@@ -31,10 +31,13 @@ import java.util.concurrent.locks.ReentrantLock;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.values.PlcList;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,6 +82,10 @@ public class PlcItemImpl implements PlcItem {
     private Date lastWriteDate;
     private Date lastErrorDate;
     
+    private AlarmSeverity   alrmSeverity;
+    private AlarmStatus     alrmStatus;
+    private String          alrmMsg;
+    
     private RingBuffer<PlcDeviceWriteEvent> writeRingBuffer = null;
 
  
@@ -355,12 +362,24 @@ public class PlcItemImpl implements PlcItem {
         writeEvent.setBitOffset(bitOffset);        
         writeRingBuffer.publish(sequenceId);
     }
+    
+    @Override
+    public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus, 
String alrmMsg) {
+        this.alrmSeverity   =   alrmSeverity;
+        this.alrmStatus     =   alrmStatus;
+        this.alrmMsg        =   alrmMsg;
+        itemClients.forEach(c -> c.setStaus(alrmSeverity, alrmStatus, 
alrmMsg));
+    }
+        
 
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder(100);
         sb.append("Name: ").append(itemName).append("\r\n").
             append("Description: ").append(itemDescription).append("\r\n").
+            append("Alarm Severity: 
").append(alrmSeverity.toString()).append("\r\n").
+            append("Alarm Status: 
").append(alrmStatus.toString()).append("\r\n").
+            append("Alarm Message: ").append(alrmMsg).append("\r\n").          
      
             append("Id: ").append(itemId).append("\r\n"). 
             append("UID: ").append(itemUid).append("\r\n").
             append("Is enable: ").append(itemEnable).append("\r\n").
@@ -377,7 +396,8 @@ public class PlcItemImpl implements PlcItem {
             append(ByteBufUtil.prettyHexDump(itemBuffer)).append("\r\n");      
          
         return sb.toString();
     }
-    
+
+
     public static class PlcItemBuilder {
         private final String itemName;
         private  UUID itemUid;    
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
index d6ff50f..553d2bf 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
@@ -125,12 +125,6 @@
             <artifactId>org.osgi.core</artifactId>
             <version>6.0.0</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x.merlot.das.base</groupId>
-            <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
-            <version>0.13.0-SNAPSHOT</version>
-            <type>jar</type>
-        </dependency>
         <dependency>
             <groupId>org.apache.plc4x.merlot.api</groupId>
             <artifactId>org.apache.plc4x.merlot.api</artifactId>
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 b4e2fa5..61e510a 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
@@ -25,11 +25,16 @@ import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
+import org.epics.pvdata.pv.PVInt;
+import org.epics.pvdata.pv.PVString;
 import org.epics.pvdata.pv.PVStructure;
 import org.epics.pvdatabase.PVRecord;
 
-
-public class DBRecord extends PVRecord  {   
+@SuppressWarnings("nls")
+public class DBRecord extends PVRecord   implements PlcItemListener {   
     protected static final String MONITOR_FIELDS = "field(write_value,"+       
  
             "id,"+
             "offset,"+
@@ -102,8 +107,34 @@ public class DBRecord extends PVRecord  {
             bitOffset  = (byte) Integer.parseInt(matcher.group(BIT_OFFSET ));  
          
         }
     }
-    
-    
-    
+
+
+    @Override
+    public void atach(PlcItem plcItem) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void detach() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void update() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus, 
String alrmMsg) {
+        PVStructure structAlarm = getPVStructure().getStructureField("alarm");
+        PVInt pvSeverity = (PVInt) structAlarm.getIntField("severity");
+        PVInt pvStatus = (PVInt) structAlarm.getIntField("status");  
+        PVString pvMsg = (PVString) structAlarm.getStringField("message"); 
+                
+        pvSeverity.put(alrmSeverity.ordinal());
+        pvStatus.put(alrmStatus.ordinal());
+        pvMsg.put(alrmMsg);        
+    }    
+       
     
 }
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 8db87f6..993f87d 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
@@ -28,9 +28,13 @@ 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.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
 import org.epics.pvdata.pv.FieldCreate;
 import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVBooleanArray;
+import org.epics.pvdata.pv.PVInt;
+import org.epics.pvdata.pv.PVString;
 import org.epics.pvdata.pv.PVStructure;
 import org.epics.pvdata.pv.ScalarType;
 
@@ -87,7 +91,7 @@ public class DBBooleanFactory extends DBBaseFactory {
         return dbRecord;
     }
     
-    class DBBooleanRecord extends DBRecord implements PlcItemListener {
+    class DBBooleanRecord extends DBRecord {
         
         private PVBoolean value;
         private PVBoolean write_value;
@@ -125,7 +129,7 @@ public class DBBooleanFactory extends DBBaseFactory {
                 //offset = this.getPVStructure().getIntField("offset").get() * 
Byte.BYTES; 
                 getOffset( 
this.getPVStructure().getStringField("offset").get());
                 innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, 
Byte.BYTES);
-                innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
+                innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);         
       
             } catch (Exception ex) {
                 LOGGER.error(this.getClass().getName() + " : " + 
ex.getMessage());
             }
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
deleted file mode 100644
index d24fa33..0000000
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
- * 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 org.apache.plc4x.merlot.api.DriverEvent;
-import org.apache.plc4x.merlot.api.core.Merlot;
-import org.apache.plc4x.merlot.das.base.api.BaseDriver;
-import org.apache.plc4x.merlot.db.api.DBCollector;
-import org.apache.plc4x.merlot.scheduler.api.JobContext;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-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.messages.PlcWriteRequest;
-import org.epics.pvdata.copy.CreateRequest;
-import org.epics.pvdata.copy.PVCopy;
-import org.epics.pvdata.copy.PVCopyFactory;
-import org.epics.pvdata.property.PVTimeStamp;
-import org.epics.pvdata.property.PVTimeStampFactory;
-import org.epics.pvdata.property.TimeStamp;
-import org.epics.pvdata.property.TimeStampFactory;
-import org.epics.pvdata.pv.BooleanArrayData;
-import org.epics.pvdata.pv.ByteArrayData;
-import org.epics.pvdata.pv.DoubleArrayData;
-import org.epics.pvdata.pv.FloatArrayData;
-import org.epics.pvdata.pv.IntArrayData;
-import org.epics.pvdata.pv.LongArrayData;
-import org.epics.pvdata.pv.PVBoolean;
-import org.epics.pvdata.pv.PVBooleanArray;
-import org.epics.pvdata.pv.PVByte;
-import org.epics.pvdata.pv.PVByteArray;
-import org.epics.pvdata.pv.PVDouble;
-import org.epics.pvdata.pv.PVDoubleArray;
-import org.epics.pvdata.pv.PVField;
-import org.epics.pvdata.pv.PVFloat;
-import org.epics.pvdata.pv.PVFloatArray;
-import org.epics.pvdata.pv.PVInt;
-import org.epics.pvdata.pv.PVIntArray;
-import org.epics.pvdata.pv.PVLong;
-import org.epics.pvdata.pv.PVLongArray;
-import org.epics.pvdata.pv.PVScalar;
-import org.epics.pvdata.pv.PVScalarArray;
-import org.epics.pvdata.pv.PVShort;
-import org.epics.pvdata.pv.PVShortArray;
-import org.epics.pvdata.pv.PVString;
-import org.epics.pvdata.pv.PVStringArray;
-import org.epics.pvdata.pv.PVStructure;
-import org.epics.pvdata.pv.PVUByte;
-import org.epics.pvdata.pv.PVUInt;
-import org.epics.pvdata.pv.PVULong;
-import org.epics.pvdata.pv.PVUShort;
-import org.epics.pvdata.pv.ShortArrayData;
-import org.epics.pvdata.pv.StringArrayData;
-import org.epics.pvdata.util.pvDataHelper.GetHelper;
-import org.epics.pvdatabase.PVListener;
-import org.epics.pvdatabase.PVRecord;
-import org.epics.pvdatabase.PVRecordField;
-import org.epics.pvdatabase.PVRecordStructure;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.device.Driver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-//TODO: add the logger system, the write is INFO, the read maybe DEBUG
-//TODO: Read/Write information for every tag for statical use.
-public class DBCollectorImpl implements DBCollector, PVListener {
-    
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(DBCollectorImpl.class); 
-    
-    private final BundleContext bundleContext;
-    private final String device;
-    private final BaseDriver devDriver;
-    private final PlcConnection plcConn;
-    private PlcReadRequest.Builder readRequestBuilder = null;
-    private PlcWriteRequest.Builder writeRequestBuilder = null; 
-    private PlcReadRequest readRequest = null;
-    private PlcWriteRequest writeRequest = null;
-    
-    private final PVTimeStamp pvTimeStamp = PVTimeStampFactory.create();
-    private final TimeStamp timeStamp = TimeStampFactory.create();
-    private CreateRequest createRequest = CreateRequest.create();
-    private String request = "field(timeStamp,value)";
-    private PVStructure pvRequest = createRequest.createRequest(request);
-    
-    boolean run = false;
-    private ConcurrentHashMap<String, PVRecord> items = new 
ConcurrentHashMap<String, PVRecord>();
-
-    public DBCollectorImpl(BundleContext bundleContext, String device) {
-        this.bundleContext = bundleContext;
-        this.device = device;
-        this.devDriver = getDriver(device);
-        this.plcConn = devDriver.getPlcConnection();
-        if (plcConn == null){LOGGER.info("DBCollectorImpl. Connection is  
null");}
-    }
-    
-    @Override
-    public void execute(JobContext ctx) {
-        if (run) {
-            DriverEvent event = devDriver.getEvent();
-            event.setFunctionCode(Merlot.FUNCTION.FC_READ_MEMORY_BYTES);
-            event.setPlcReadRequest(readRequest);
-            event.setCallback(this); 
-            devDriver.putEvent(event);
-        };
-    }
-
-    //TODO: Manejo por función solicitada
-    //TODO: Replace item with Master database instance
-    @Override
-    public void execute(DriverEvent cb) {
-        PVRecord pvRecord = null;
-        PVField value = null;
-        PVBoolean enable = null;
-        boolean disable = false;
-        if (cb.getPlcReadResponse() != null) {           
-            PlcReadResponse drvResponse = cb.getPlcReadResponse();
-            PlcReadRequest drvRequest = drvResponse.getRequest();
-            
-            Set<String> strFields = drvRequest.getTagNames();
-            
-            for(String strField:strFields) {
-
-                pvRecord = items.get(strField);   
-                value =  pvRecord.getPVStructure().getSubField("value");
-
-                enable = 
pvRecord.getPVStructure().getBooleanField("scan_enable");
-                
-                disable = false;
-                if (enable == null){
-                    LOGGER.info("There is no \"enable\" field in the PVRecord. 
Could not process.");
-                    disable = true;
-                } else if (!enable.get()){
-                    LOGGER.info("PVRecord[" + pvRecord.getRecordName()+"] is 
disabled.");
-                    disable = true;
-                }
-                
-                if (!disable) {
-                    switch(value.getField().getType()) {
-                        case scalar:
-                                readScalar(drvResponse, pvRecord);
-                            break;
-                        case scalarArray:
-                                readScalarArray(drvResponse, pvRecord);        
            
-                            break;
-                        case structure:
-                                executeStructure(drvResponse, pvRecord);       
              
-                            break;
-                        case structureArray:
-                                executeStructureArray(drvResponse, pvRecord);  
                   
-                            break;
-                        case union:
-                                executeUnion(drvResponse, pvRecord);           
          
-                            break;
-                        case unionArray:
-                                executeUnionArray(drvResponse, pvRecord); 
-                            break;                
-                    }
-                }
-            }
-        } else if (cb.getPlcWriteResponse() != null){
-            LOGGER.info("Write ready...");
-        }                
-    }
-    
-    @Override
-    public void attach(Collection<PVRecord> pvRecords) {
-        run = false; 
-    
-        if (plcConn == null){LOGGER.info("Conexion null");}
-        if (plcConn.isConnected()){      
-            readRequestBuilder = this.plcConn.readRequestBuilder(); 
-            for (PVRecord pvRecord:pvRecords){
-                items.put(pvRecord.getRecordName(), pvRecord);
-                readRequestBuilder.addTagAddress(pvRecord.getRecordName(), 
pvRecord.getPVStructure().getStringField("id").get());
-                PVCopy pvCopy = 
PVCopyFactory.create(pvRecord.getPVRecordStructure().getPVStructure(), 
pvRequest, "");
-                pvRecord.addListener(this, pvCopy);
-            }
-            readRequest = readRequestBuilder.build();
-          } else {
-            LOGGER.info("Driver not connected...");
-        }
-        run = true;
-    }
-
-
-    @Override
-    public void detach(Collection<PVRecord> pvRecords) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-    
-    private BaseDriver getDriver(String device){
-        try{
-            String filterdriver =  "(DRIVER_ID=" + device + ")"; 
-            ServiceReference[] refdrvs = 
bundleContext.getAllServiceReferences(Driver.class.getName(), filterdriver);
-            BaseDriver refdrv = (BaseDriver) 
bundleContext.getService(refdrvs[0]);
-            return refdrv;            
-        } catch (Exception ex){
-            LOGGER.info(ex.toString());
-        }
-        return null;
-    }
-
-    
-    @Override
-    public void dataPut(PVRecordField pvRecordField) {
-    }
-
-    @Override
-    public void dataPut(PVRecordStructure pvStructure, PVRecordField 
pvRecordField) {   
-    }
-
-    @Override
-    public void beginGroupPut(PVRecord pvRecord) {        
-    }
-
-    //TODO: Manejo de diferentes tipos    
-    @Override
-    public void endGroupPut(PVRecord pvRecord) {
-        PVField pvField =  pvRecord.getPVStructure().getSubField("value");
-        switch(pvField.getField().getType()){
-            case scalar:
-                    writeScalar(pvRecord);
-                break;
-            case scalarArray:
-                    writeScalarArray(pvRecord);                    
-                break;
-            case structure:
-;                     
-                break;
-            case structureArray:
-                    
-                break;
-            case union:
-                  
-                break;
-            case unionArray:
- 
-                break;                            
-        }
-    }
-
-    @Override
-    public void unlisten(PVRecord arg0) {
-        LOGGER.info("Unlisten: ");
-    }
-    
-    private void readScalar(PlcReadResponse response, PVRecord pvRecord){
-        PVScalar value = (PVScalar) 
pvRecord.getPVStructure().getSubField("value");
-        pvRecord.lock();
-        try{
-            switch(value.getScalar().getScalarType()){
-                case pvBoolean:
-                    ((PVBoolean) 
value).put(response.getBoolean(pvRecord.getRecordName()));
-                    break;
-                case pvByte:
-                    ((PVByte) 
value).put(response.getByte(pvRecord.getRecordName()));
-                    break;
-                case pvShort:
-                    ((PVShort) 
value).put(response.getShort(pvRecord.getRecordName()));
-                    break;
-                case pvInt:
-                    ((PVInt) 
value).put(response.getInteger(pvRecord.getRecordName()));
-                    break;
-                case pvLong:
-                    ((PVLong) 
value).put(response.getInteger(pvRecord.getRecordName()));                    
-                    break;
-                case pvUByte:
-                    ((PVUByte) 
value).put(response.getByte(pvRecord.getRecordName()));                    
-                    break;
-                case pvUShort:
-                    ((PVUShort) 
value).put(response.getShort(pvRecord.getRecordName()));                    
-                    break;
-                case pvUInt:
-                    ((PVUInt) 
value).put(response.getInteger(pvRecord.getRecordName()));                    
-                    break;
-                case pvULong:
-                    ((PVULong) 
value).put(response.getLong(pvRecord.getRecordName()));                    
-                    break;
-                case pvFloat:
-                    ((PVFloat) 
value).put(response.getFloat(pvRecord.getRecordName()));                    
-                    break;
-                case pvDouble:
-                    ((PVDouble) 
value).put(response.getDouble(pvRecord.getRecordName()));                    
-                    break;
-                case pvString:
-                    ((PVString) 
value).put(response.getString(pvRecord.getRecordName()));                    
-                    break;
-                default:
-                    LOGGER.info("Unsupported type.");
-                    break;
-            }
-            pvRecord.process();
-        } catch(Exception ex){
-            LOGGER.info("executeScalar: " + ex.getMessage());
-        } finally{
-            pvRecord.unlock();
-        }
-    }
-    
-    private void readScalarArray(PlcReadResponse response, PVRecord pvRecord){
-        PVScalarArray value = (PVScalarArray) 
pvRecord.getPVStructure().getSubField("value");        
-        pvRecord.lock();
-        try{
-            switch(value.getScalarArray().getElementType()){
-                case pvBoolean:{
-                    Collection<Boolean> resObjects = 
response.getAllBooleans(pvRecord.getRecordName()); 
-                    boolean[] arrBooleans = new boolean[resObjects.size()];
-                    Iterator<Boolean> itr = resObjects.iterator();
-                    Boolean objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrBooleans[i] = objValue;
-                        i++;
-                    }
-                    ((PVBooleanArray) 
value).put(0,resObjects.size(),arrBooleans,0);
-                }
-                    break;
-                    
-                case pvByte:
-                case pvUByte:
-                {
-                    Collection<Byte> resObjects = 
response.getAllBytes(pvRecord.getRecordName()); 
-                    byte[] arrBytes = new byte[resObjects.size()];
-                    Iterator<Byte> itr = resObjects.iterator();
-                    Byte objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrBytes[i] = objValue;
-                        i++;
-                    }                    
-                    ((PVByteArray) value).put(0,resObjects.size(),arrBytes,0);
-                }
-                    break;
-                case pvShort: 
-                case pvUShort:
-                {
-                    Collection<Short> resObjects = 
response.getAllShorts(pvRecord.getRecordName()); 
-                    short[] arrShorts = new short[resObjects.size()];
-                    Iterator<Short> itr = resObjects.iterator();
-                    Short objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrShorts[i] = objValue;
-                        i++;
-                    }     
-                    int capacity = ((PVShortArray) value).getCapacity();
-                    ((PVShortArray) value).put(0,capacity,arrShorts,0);
-                }
-                    break;
-                case pvInt: 
-                case pvUInt:                
-                {
-                    Collection<Integer> resObjects = 
response.getAllIntegers(pvRecord.getRecordName()); 
-                    int[] arrIntegers = new int[resObjects.size()];
-                    Iterator<Integer> itr = resObjects.iterator();
-                    Integer objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrIntegers[i] = objValue;
-                        i++;
-                    }     
-                    int capacity = ((PVIntArray) value).getCapacity();
-                    ((PVIntArray) value).put(0,capacity,arrIntegers,0);
-                }
-                    break;
-                case pvLong: 
-                case pvULong:                    
-                {
-                    Collection<Long> resObjects = 
response.getAllLongs(pvRecord.getRecordName()); 
-                    long[] arrLongs = new long[resObjects.size()];
-                    Iterator<Long> itr = resObjects.iterator();
-                    Long objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrLongs[i] = objValue;
-                        i++;
-                    }           
-                    int capacity = ((PVLongArray) value).getCapacity();
-                    ((PVLongArray) value).put(0,capacity,arrLongs,0);
-                }               
-                    break;
-                case pvFloat:
-                {
-                    Collection<Float> resObjects = 
response.getAllFloats(pvRecord.getRecordName()); 
-                    float[] arrFloats = new float[resObjects.size()];
-                    Iterator<Float> itr = resObjects.iterator();
-                    Float objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break;                     
-                        arrFloats[i] = objValue;
-                        i++;
-                    }     
-                    int capacity = ((PVFloatArray) value).getCapacity();
-                    ((PVFloatArray) value).put(0,capacity,arrFloats,0);
-                }                                 
-                    break;
-                case pvDouble:
-                {
-                    Collection<Double> resObjects = 
response.getAllDoubles(pvRecord.getRecordName()); 
-                    double[] arrDoubles = new double[resObjects.size()];
-                    Iterator<Double> itr = resObjects.iterator();
-                    Double objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrDoubles[i] = objValue;
-                        i++;
-                    }         
-                    int capacity = ((PVDoubleArray) value).getCapacity();
-                    ((PVDoubleArray) 
value).put(0,resObjects.size(),arrDoubles,0);
-                }                                         
-                    break;
-                case pvString:  
-                {
-                    Collection<String> resObjects = 
response.getAllStrings(pvRecord.getRecordName()); 
-                    String[] arrStrings = new String[resObjects.size()];
-                    Iterator<String> itr = resObjects.iterator();
-                    String objValue;
-                    int i = 0;
-                    while(itr.hasNext()){
-                        objValue = itr.next();
-                        if (objValue == null) break; 
-                        arrStrings[i] = objValue;
-                        i++;
-                    }    
-                    int capacity = ((PVStringArray) value).getCapacity();
-                    ((PVStringArray) 
value).put(0,resObjects.size(),arrStrings,0);
-                }                      
-                    break;
-                default:
-                        LOGGER.info("Unsupported type.");
-                    break;
-            }
-            pvRecord.process();
-        } catch (Exception ex){
-            ex.printStackTrace();
-            LOGGER.info(ex.getMessage());
-        } finally{
-            pvRecord.unlock();
-        }        
-    }
-    
-    private void executeStructure(PlcReadResponse response, PVRecord pvRecord){
-        
-    }
-    
-    private void executeStructureArray(PlcReadResponse response, PVRecord 
pvRecord){
-        
-    }   
-    
-    private void executeUnion(PlcReadResponse response, PVRecord pvRecord){
-        
-    }     
-    
-    private void executeUnionArray(PlcReadResponse response, PVRecord 
pvRecord){
-        
-    }     
-    
-    private void writeScalar(PVRecord pvRecord){
-        try {    
-            pvRecord.lock();            
-            PVScalar valueScalar = (PVScalar) 
pvRecord.getPVStructure().getSubField("value");
-            Object value = null;
-            switch(valueScalar.getScalar().getScalarType()){
-                case pvBoolean:
-                    value = 
pvRecord.getPVStructure().getBooleanField("value").get();
-                    break;                   
-                case pvByte:
-                case pvUByte:                     
-                    value = 
pvRecord.getPVStructure().getByteField("value").get();
-                    break;
-                case pvShort:
-                case pvUShort:                    
-                    value = 
pvRecord.getPVStructure().getShortField("value").get();
-                    break;
-                case pvInt:
-                case pvUInt:                    
-                    value = 
pvRecord.getPVStructure().getIntField("value").get();
-                    break;
-                case pvLong:
-                case pvULong:                    
-                    value = 
pvRecord.getPVStructure().getLongField("value").get();
-                    break;
-                case pvFloat:
-                    value = 
pvRecord.getPVStructure().getFloatField("value").get();                   
-                    break;
-                case pvDouble:
-                    value = 
pvRecord.getPVStructure().getDoubleField("value").get();                   
-                    break;
-                case pvString:
-                    value = 
pvRecord.getPVStructure().getStringField("value").get();                      
-                    break;
-                default:
-                    LOGGER.info("Unsupported type.");
-                    break;
-            }
-                                         
-            writeRequestBuilder = plcConn.writeRequestBuilder();
-            writeRequestBuilder.addTagAddress(pvRecord.getRecordName(), 
-                    pvRecord.getPVStructure().getStringField("id").get(), 
-                    value);
-            writeRequest = writeRequestBuilder.build();
-            
-            DriverEvent event = devDriver.getEvent();
-            event.setFunctionCode(Merlot.FUNCTION.FC_WRITE_DATA_BYTES);
-            event.setPlcWriteRequest(writeRequest);
-            event.setCallback(this); 
-            devDriver.putEvent(event);  
-        } catch (Exception ex){
-            LOGGER.info("Exception ex: " + ex);
-        }  finally{
-            pvRecord.unlock();
-        }  
-        
-    }  
-    
-    private void writeScalarArray(PVRecord pvRecord){
-        try{
-            pvRecord.lock();
-            PVScalarArray valueScalarArray = (PVScalarArray) 
pvRecord.getPVStructure().getSubField("value");  
-            Object value = null;
-            switch(valueScalarArray.getScalarArray().getElementType()){
-                case pvBoolean:
-                    value = getBooleanVector((PVBooleanArray) 
valueScalarArray); 
-                    break;                   
-                case pvByte:
-                case pvUByte:                     
-                    value = getByteVector((PVByteArray) valueScalarArray); 
-                    break;
-                case pvShort:
-                case pvUShort:                    
-                    value = getShortVector((PVShortArray) valueScalarArray); 
-                    break;
-                case pvInt:
-                case pvUInt:                    
-                    value = getIntVector((PVIntArray) valueScalarArray);
-                    break;
-                case pvLong:
-                case pvULong:                    
-                    value = getLongVector((PVLongArray) valueScalarArray);
-                    break;
-                case pvFloat:
-                    value = getFloatVector((PVFloatArray) valueScalarArray);   
                
-                    break;
-                case pvDouble:
-                    value = getDoubleVector((PVDoubleArray) valueScalarArray); 
                 
-                    break;
-                case pvString:
-                    value = GetHelper.getStringVector((PVStringArray) 
valueScalarArray);                       
-                    break;
-                default:
-                    LOGGER.info("Unsupported type.");
-                    break;
-            }
-                                         
-            writeRequestBuilder = plcConn.writeRequestBuilder();
-            writeRequestBuilder.addTagAddress(pvRecord.getRecordName(), 
-                    pvRecord.getPVStructure().getStringField("id").get(), 
-                    ((Vector)value).toArray());
-            writeRequest = writeRequestBuilder.build();
-            
-            DriverEvent event = devDriver.getEvent();
-            event.setFunctionCode(Merlot.FUNCTION.FC_WRITE_DATA_BYTES);
-            event.setPlcWriteRequest(writeRequest);
-            event.setCallback(this); 
-            devDriver.putEvent(event);              
-        } catch (Exception ex){
-            LOGGER.info("writeScalarArray: " + ex.toString());
-        } finally {
-            pvRecord.unlock();            
-        }
-    }
-        
-    public static Vector<Boolean> getBooleanVector( PVBooleanArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Boolean> ret = new Vector<>();
-        BooleanArrayData data = new BooleanArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }        
-    
-    public static Vector<Byte> getByteVector( PVByteArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Byte> ret = new Vector<>();
-        ByteArrayData data = new ByteArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }         
-    
-    public static Vector<Short> getShortVector( PVShortArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Short> ret = new Vector<>();
-        ShortArrayData data = new ShortArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }    
-    
-    public static Vector<Integer> getIntVector( PVIntArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Integer> ret = new Vector<>();
-        IntArrayData data = new IntArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }   
-    
-    public static Vector<Long> getLongVector( PVLongArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Long> ret = new Vector<>();
-        LongArrayData data = new LongArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }        
-        
-
-    public static Vector<Float> getFloatVector( PVFloatArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Float> ret = new Vector<>();
-        FloatArrayData data = new FloatArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }
-    
-    public static Vector<Double> getDoubleVector( PVDoubleArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<Double> ret = new Vector<>();
-        DoubleArrayData data = new DoubleArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    } 
-    
-    public static Vector<String> getStringVector( PVStringArray pv )
-    {
-        int len = pv.getLength();
-        // double[] storage = new double[len];
-        Vector<String> ret = new Vector<>();
-        StringArrayData data = new StringArrayData();
-        int offset = 0;
-        while(offset < len) {
-            int num = pv.get(offset,(len-offset),data);
-            for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
-            // System.arraycopy(data.data,data.offset,storage,offset,num);
-            offset += num;
-        }
-        return ret;
-    }      
-    
-}
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
deleted file mode 100644
index 24921d7..0000000
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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 org.apache.plc4x.merlot.db.api.DBCollector;
-import org.apache.plc4x.merlot.db.api.DBControl;
-import org.apache.plc4x.merlot.scheduler.api.Job;
-import org.apache.plc4x.merlot.scheduler.api.JobContext;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.epics.pvdatabase.PVRecord;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-
-
-public class DBControlImpl implements DBControl {
-
-    
-    BundleContext bundleContext;
-    
-    
-    @Override
-    public void attach(String device, Collection<PVRecord> pvRecords) {
-
-        List<PVRecord> pvTemp = null;
-        PVRecord pvRecord = null;
-        
-        Map<String, List<PVRecord>> byScanRate = pvRecords.stream()
-        .collect(Collectors.groupingBy(record -> 
record.getPVStructure().getStringField("scan_rate").get()));        
-        
-        for (String key:byScanRate.keySet()){
-            DBCollector collector = registerCollector(device,key);
-            collector.attach(byScanRate.get(key));
-        }
-        
-    }
-
-    @Override
-    public void detach(PVRecord pvRecord) {
-        System.out.println("detach PVRecord: "+ 
pvRecord.getPVStructure().getShortField("id"));
-    }
-
-    @Override
-    public void execute(JobContext ctx) {
-
-    }
-
-    @Override
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    private DBCollector registerCollector(String device, String scanrate){
-        Hashtable properties = new Hashtable(); 
-        properties.put("collector.das.device", device);
-        properties.put("scheduler.name", device+":"+scanrate);
-        properties.put("scheduler.period", scanrate);
-        properties.put("scheduler.immediate", true);
-        properties.put("scheduler.concurrent", false);
-        
-        DBCollector collector = new DBCollectorImpl(bundleContext, device);
-        
-        bundleContext.registerService(new 
String[]{DBCollector.class.getName(), Job.class.getName()}, collector, 
properties);         
-        
-        return collector;
-    }
-    
-    private DBCollector getCollector(String driver, String device, String 
scanrate){
-        try
-        {
-            String filter =  "(&(" + Constants.OBJECTCLASS + "=" + 
DBCollector.class.getName() + ")" +
-                             "(&(scheduler.name=" + device+":"+scanrate + 
")(scheduler.period=" + scanrate + ")))";
-            
-            ServiceReference[] references = 
bundleContext.getServiceReferences((String) null, filter);
-            if (references != null){
-                ServiceReference reference = references[0];
-                return (DBCollector) reference.getBundle();
-            }            
-        } catch(Exception ex) {
-            
-        };
-        return null;
-    }
-    
-    
-}
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 ef12847..7eec795 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
@@ -50,11 +50,11 @@
           factory-method="getChannelProviderLocal" 
           scope="singleton"/>
     
-    <bean id="DBControl" 
+<!--    <bean id="DBControl" 
           class="org.apache.plc4x.merlot.db.impl.DBControlImpl" 
           scope="singleton">
         <property name="bundleContext" ref="blueprintBundleContext"/>
-    </bean>
+    </bean>-->
     
     <bean id="DBWriterHandlerImpl" 
class="org.apache.plc4x.merlot.db.impl.DBWriterHandlerImpl"/>    
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
index 94a1867..8c282ad 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
@@ -79,5 +79,10 @@
             <version>2.0.13</version>
             <type>jar</type>
         </dependency>
+        <dependency>
+            <groupId>org.apache.plc4x.merlot.db</groupId>
+            <artifactId>org.apache.plc4x.merlot.db</artifactId>
+            <version>0.13.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 </project>
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.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
similarity index 57%
copy from 
plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
copy to 
plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
index 8db87f6..ddaa03f 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.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
@@ -16,88 +16,93 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.merlot.db.core;
-
+package org.apache.plc4x.merlot.drv.s7.core;
 
 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.apache.plc4x.merlot.db.core.DBBaseFactory;
 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.FieldBuilder;
 import org.epics.pvdata.pv.FieldCreate;
 import org.epics.pvdata.pv.PVBoolean;
-import org.epics.pvdata.pv.PVBooleanArray;
+import org.epics.pvdata.pv.PVShort;
+import org.epics.pvdata.pv.PVShortArray;
+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 {
-    
-    private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();    
-    
-    public DBBooleanFactory() {};
+public class DBS7CounterFactory extends DBBaseFactory {
     
+    private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
+       
     @Override
     public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
+        FieldBuilder fb = fieldCreate.createFieldBuilder();
+
         PVStructure pvStructure = ntScalarBuilder.
-            value(ScalarType.pvBoolean).
-            addDescriptor(). 
-            add("id", fieldCreate.createScalar(ScalarType.pvString)). 
+            value(ScalarType.pvShort).
+            addDescriptor().            
+            add("id", fieldCreate.createScalar(ScalarType.pvString)).  
             add("offset", fieldCreate.createScalar(ScalarType.pvString)).      
           
             add("scan_time", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", 
fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_value", 
fieldCreate.createScalar(ScalarType.pvBoolean)). 
+            add("write_enable", 
fieldCreate.createScalar(ScalarType.pvBoolean)).  
+            add("write_value", fieldCreate.createScalar(ScalarType.pvShort)).  
               
             addAlarm().
             addTimeStamp().
             addDisplay().
             addControl(). 
-            createPVStructure();    
-        DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+            createPVStructure();          
+        DBRecord dbRecord = new DBS7CounterRecord(recordName,pvStructure);     
 
         return dbRecord;
     }
 
     @Override
-    public DBRecord createArray(String recordName, int length) {
-        NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();        
+    public DBRecord createArray(String recordName,int length) {
+        NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();            
    
         NTScalarArrayBuilder ntScalarArrayBuilder = 
NTScalarArray.createBuilder();
+
         PVStructure pvStructure = ntScalarArrayBuilder.
-            value(ScalarType.pvBoolean).
+            value(ScalarType.pvShort).
             addDescriptor(). 
             add("id", fieldCreate.createScalar(ScalarType.pvString)). 
             add("offset", fieldCreate.createScalar(ScalarType.pvString)).      
           
             add("scan_time", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
             add("write_enable", 
fieldCreate.createScalar(ScalarType.pvBoolean)). 
-            add("write_value", 
fieldCreate.createFixedScalarArray(ScalarType.pvBoolean, length)).
+            add("write_value", 
fieldCreate.createFixedScalarArray(ScalarType.pvShort, length)).                
   
             addAlarm().
             addTimeStamp().
             addDisplay().
             addControl(). 
             createPVStructure();
-        PVBooleanArray pvValue = (PVBooleanArray) 
pvStructure.getScalarArrayField("value", ScalarType.pvBoolean);
+        PVShortArray pvValue = (PVShortArray) 
pvStructure.getScalarArrayField("value", ScalarType.pvShort);
         pvValue.setCapacity(length);
-        pvValue.setLength(length);        
-        DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+        pvValue.setLength(length);
+        DBRecord dbRecord = new DBS7CounterRecord(recordName,pvStructure);
         return dbRecord;
     }
+           
+    class DBS7CounterRecord extends DBRecord implements PlcItemListener {    
     
-    class DBBooleanRecord extends DBRecord implements PlcItemListener {
-        
-        private PVBoolean value;
-        private PVBoolean write_value;
-        private PVBoolean write_enable;
-        private boolean blnValue = false;
-                 
-        public DBBooleanRecord(String recordName,PVStructure pvStructure) {
+        private PVShort value; 
+        private PVShort write_value;
+        private PVBoolean write_enable;  
+        short b, c, d, bcd;
+    
+        public DBS7CounterRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getBooleanField("value");
-            write_value = pvStructure.getBooleanField("write_value"); 
+            value = pvStructure.getShortField("value");
+            write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");        
    
         }    
 
@@ -107,28 +112,23 @@ public class DBBooleanFactory extends DBBaseFactory {
          */
         public void process()
         {
-            if (null != plcItem) {    
-                if (write_enable.get()) {    
+            if (null != plcItem) {               
+                if (write_enable.get()) {                          
                     write_value.put(value.get());                           
                     innerWriteBuffer.clear();                     
-                    innerWriteBuffer.writeBoolean(write_value.get());          
               
+                    innerWriteBuffer.writeShort(write_value.get());            
             
                     super.process();                      
                 }
-                
-            }             
-        } 
+            }               
+        }
 
         @Override
-        public void atach(PlcItem plcItem) {
-            try {
-                this.plcItem = plcItem;
-                //offset = this.getPVStructure().getIntField("offset").get() * 
Byte.BYTES; 
-                getOffset( 
this.getPVStructure().getStringField("offset").get());
-                innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, 
Byte.BYTES);
-                innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
-            } catch (Exception ex) {
-                LOGGER.error(this.getClass().getName() + " : " + 
ex.getMessage());
-            }
+        public void atach(final PlcItem plcItem) {
+            this.plcItem = plcItem;
+            //offset = this.getPVStructure().getIntField("offset").get() * 
Short.BYTES;  
+            getOffset( this.getPVStructure().getStringField("offset").get());  
          
+            innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, 
Short.BYTES);
+            innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
 
         @Override
@@ -136,32 +136,22 @@ public class DBBooleanFactory extends DBBaseFactory {
             this.plcItem  = null;
         }
 
-        /*
-        * 
***************************************************************************
-        * Modbus      : Return a array of bytes, where every byte is a boolean.
-        * S7          : Return a array of bytes, where every byte, packet 8 
booleans.        
-        * Ethernet/IP : TODO:
-        * 
***************************************************************************     
   
-        */
         @Override
-        public void update() {
-            if (null != plcItem)   {   
-                if (bitOffset == -1) {
-                    if (value.get() != innerBuffer.getBoolean(0))              
      
-                        value.put(innerBuffer.getBoolean(0));
-                } else {
-                    blnValue = ((innerBuffer.getByte(0) >> bitOffset & 1) == 
1);
-                    value.put(blnValue);
-                }
+        public void update() {    
+            if (null != plcItem) {
+                b = (short)(innerBuffer.getByte(0) & 0x0F);
+                c = (short)((innerBuffer.getByte(1) & 0xF0) >> 4);
+                d = (short)(innerBuffer.getByte(1) & 0x0F);
+                bcd = (short)(b*100 + c*10 + d);
+                if (value.get() != bcd)
+                    value.put(bcd);
             }
         }
-
+        
         @Override
         public String getFieldsToMonitor() {
             return MONITOR_FIELDS;
-        }
-                                
+        }        
     }
-    
-    
+           
 }
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
index ae2e02b..c923728 100644
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
+++ 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
@@ -31,6 +31,9 @@
 
     <bean id="S7PlcEventConnectionFunctionBean" 
class="org.apache.plc4x.merlot.drv.s7.impl.S7PlcEventConnectionFunctionImpl" 
scope="singleton">           
     </bean>
+    
+    <bean id="DBS7CounterFactoryBean" 
class="org.apache.plc4x.merlot.drv.s7.core.DBS7CounterFactory" 
scope="singleton">           
+    </bean>
 
 
     <service  ranking="0" ref="S7PlcTagFunctionBean" auto-export="interfaces">
@@ -51,6 +54,14 @@
             <entry key="dal.function.version"     
value="org.apache.plc4x.s7"/>   
             <entry key="dal.function.type"        value="wrapper"/>            
          
         </service-properties>        
-    </service>    
+    </service>   
+    
+    <service id="DBS7CounterFactory"     
+             ref="DBS7CounterFactoryBean" 
+             interface="org.apache.plc4x.merlot.db.api.DBRecordFactory">
+        <service-properties>
+            <entry key="db.record.type" value="s7counter"/>            
+        </service-properties>
+    </service>      
 
 </blueprint>
\ No newline at end of file

Reply via email to