From 7a8bcf49a42947e2142546f8e7713c47c4e811fe Mon Sep 17 00:00:00 2001
From: vargheseg <19566373+vargheseg@users.noreply.github.com>
Date: Wed, 23 Sep 2020 08:56:10 +0200
Subject: [PATCH] Support zmq publishing form cs to app.

The adapter publishes value changes made from the control system side
for the following types:
  DoocsSpectrum
  DoocsIfff
  DoocsProcessArray
  DoocsProcessScalar
---
 include/DoocsProcessArray.h  | 19 +++++++++++++++++++
 include/DoocsProcessScalar.h | 19 +++++++++++++++++++
 src/DoocsIfff.cc             | 19 +++++++++++++++++++
 src/DoocsSpectrum.cc         | 19 +++++++++++++++++++
 4 files changed, 76 insertions(+)

diff --git a/include/DoocsProcessArray.h b/include/DoocsProcessArray.h
index 490b803..4c5d8eb 100644
--- a/include/DoocsProcessArray.h
+++ b/include/DoocsProcessArray.h
@@ -50,6 +50,25 @@ namespace ChimeraTK {
     void set(EqAdr* eqAdr, EqData* data1, EqData* data2, EqFct* eqFct) override {
       DOOCS_T::set(eqAdr, data1, data2, eqFct);
       sendToDevice();
+      // send data via ZeroMQ if enabled
+      if(publishZMQ) {
+        auto timestamp = _processArray->getVersionNumber().getTime();
+        auto seconds = std::chrono::system_clock::to_time_t(timestamp);
+        auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
+            timestamp - std::chrono::system_clock::from_time_t(seconds))
+                                .count();
+        dmsg_info info;
+        memset(&info, 0, sizeof(info));
+        info.sec = seconds;
+        info.usec = microseconds;
+        if(_macroPulseNumberSource != nullptr) {
+          info.ident = _macroPulseNumberSource->accessData(0);
+        }
+        else {
+          info.ident = 0;
+        }
+        this->send(&info);
+      }
     }
 
     /**
diff --git a/include/DoocsProcessScalar.h b/include/DoocsProcessScalar.h
index 4f8cbe3..b68e712 100644
--- a/include/DoocsProcessScalar.h
+++ b/include/DoocsProcessScalar.h
@@ -148,6 +148,25 @@ namespace ChimeraTK {
       else {
         throw ChimeraTK::logic_error("Trying to write to a non-writable variable");
       }
+      // send data via ZeroMQ if enabled
+      if(_publishZMQ) {
+        auto timestamp = _processScalar->getVersionNumber().getTime();
+        auto seconds = std::chrono::system_clock::to_time_t(timestamp);
+        auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
+            timestamp - std::chrono::system_clock::from_time_t(seconds))
+                                .count();
+        dmsg_info info;
+        memset(&info, 0, sizeof(info));
+        info.sec = seconds;
+        info.usec = microseconds;
+        if(_macroPulseNumberSource != nullptr) {
+          info.ident = _macroPulseNumberSource->accessData(0);
+        }
+        else {
+          info.ident = 0;
+        }
+        this->send(&info);
+      }
     }
 
     /**
diff --git a/src/DoocsIfff.cc b/src/DoocsIfff.cc
index b3ee22a..4e66597 100644
--- a/src/DoocsIfff.cc
+++ b/src/DoocsIfff.cc
@@ -132,6 +132,25 @@ namespace ChimeraTK {
   void DoocsIfff::set(EqAdr* eqAdr, EqData* data1, EqData* data2, EqFct* eqFct) {
     D_ifff::set(eqAdr, data1, data2, eqFct); // inherited functionality fill the local doocs buffer
     sendToApplication();
+
+    if(_publishZMQ) {
+      auto timestamp = _i1Value->getVersionNumber().getTime();
+      auto seconds = std::chrono::system_clock::to_time_t(timestamp);
+      auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
+          timestamp - std::chrono::system_clock::from_time_t(seconds))
+                              .count();
+      dmsg_info info;
+      memset(&info, 0, sizeof(info));
+      info.sec = seconds;
+      info.usec = microseconds;
+      if(_macroPulseNumberSource != nullptr) {
+        info.ident = _macroPulseNumberSource->accessData(0);
+      }
+      else {
+        info.ident = 0;
+      }
+      this->send(&info);
+    }
   }
 
   void DoocsIfff::auto_init(void) {
diff --git a/src/DoocsSpectrum.cc b/src/DoocsSpectrum.cc
index 70725d6..5fcd87c 100644
--- a/src/DoocsSpectrum.cc
+++ b/src/DoocsSpectrum.cc
@@ -62,6 +62,25 @@ namespace ChimeraTK {
     D_spectrum::set(eqAdr, data1, data2, eqFct);
     modified = true;
     sendToDevice();
+
+    if(publishZMQ) {
+      auto timestamp = _processArray->getVersionNumber().getTime();
+      auto seconds = std::chrono::system_clock::to_time_t(timestamp);
+      auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
+          timestamp - std::chrono::system_clock::from_time_t(seconds))
+                              .count();
+      dmsg_info info;
+      memset(&info, 0, sizeof(info));
+      info.sec = seconds;
+      info.usec = microseconds;
+      if(_macroPulseNumberSource != nullptr) {
+        info.ident = _macroPulseNumberSource->accessData(0);
+      }
+      else {
+        info.ident = 0;
+      }
+      this->send(&info);
+    }
   }
 
   void DoocsSpectrum::auto_init(void) {
-- 
GitLab