From b959f593acd8f7615f6146cac923367affb559a2 Mon Sep 17 00:00:00 2001
From: marcofilho <marco.filho@ess.eu>
Date: Tue, 7 Jan 2025 13:37:03 +0100
Subject: [PATCH] Add acquire and isAcquiring records.

---
 vmmTblApp/Db/vmm_tbl.template | 20 ++++++++++++++
 vmmTblApp/src/vmm_tbl.cpp     | 50 +++++++++++++++++++++++------------
 vmmTblApp/src/vmm_tbl.h       |  2 ++
 3 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/vmmTblApp/Db/vmm_tbl.template b/vmmTblApp/Db/vmm_tbl.template
index cc5847f..1a0b6ee 100644
--- a/vmmTblApp/Db/vmm_tbl.template
+++ b/vmmTblApp/Db/vmm_tbl.template
@@ -4,9 +4,29 @@ record(bo, "$(P)$(R)Acquire-S") {
     field(ZNAM, "Done")
     field(ONAM, "Acquire")
     field(DTYP, "asynInt32")
+    field(FLNK, "$(P)$(R)IsAcquiring-R")
     field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))VMM_FEN_ACQUIRE")
 }
 
+record(bi, "$(P)$(R)IsAcquiring-R") {
+    field(DESC, "Is VMM FEN Acquiring ?")
+    field(VAL,  "0")
+    field(ZNAM, "Idle")
+    field(ONAM, "Acquiring")
+    field(DTYP, "asynInt32")
+    field(SCAN, "I/O Intr")
+    field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))VMM_FEN_ACQUIRING")
+}
+
+record(waveform, "$(P)$(R)IOCMessage-R") {
+    field(DESC, "General message from IOC driver")
+    field(DTYP, "asynOctetRead")
+    field(NELM, "256")
+    field(FTVL, "CHAR")
+    field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))IOC_MESSAGE")
+    field(SCAN, "I/O Intr")
+}
+
 record(ai, "$(P)$(R)RegBankVersion-R"){
     field(DESC,  "Register bank version")
     field(PINI,  "YES")
diff --git a/vmmTblApp/src/vmm_tbl.cpp b/vmmTblApp/src/vmm_tbl.cpp
index f63be80..5d92eba 100644
--- a/vmmTblApp/src/vmm_tbl.cpp
+++ b/vmmTblApp/src/vmm_tbl.cpp
@@ -29,7 +29,7 @@ asynStatus VMMTbl::readInt32(asynUser *pasynUser, epicsInt32 *value) {
   int tmp_val;
   bool tmp_val_bool;
   uint8_t tmp_val_uint8;
-  int param_index, hyb_index, vmm_index;
+  int param_index = 0, hyb_index, vmm_index;
 
   if (function < FIRST_VMM_PARAM) {
     return asynPortDriver::readInt32(pasynUser, value);
@@ -39,7 +39,14 @@ asynStatus VMMTbl::readInt32(asynUser *pasynUser, epicsInt32 *value) {
     vmmStatus result = this->pVmmAPI->getRegBankVersion(val);
     if (result != vmmSuccess) status = asynError;
     *value = val;
-    param_index = 10000; /// \todo So endOfReadInt32 won't return asynError; Maybe improve mechanism?
+    goto endOfReadInt32;
+  }
+
+  if (function == vmmIsAcquiring_) {
+    vmmStatus result = this->pVmmAPI->isAcquiring(tmp_val_bool);
+    printf("Is acquiring: %d\n", tmp_val_bool);
+    if (result != vmmSuccess) status = asynError;
+    *value = tmp_val_bool;
     goto endOfReadInt32;
   }
 
@@ -110,7 +117,7 @@ asynStatus VMMTbl::readOctet(asynUser *pasynUser, char *value,
 	int status = asynSuccess;
 	int function = pasynUser->reason;
   std::string read = "";
-  
+
   /* If this parameter belongs to a base class call its method */
   if (function < FIRST_VMM_PARAM) {
       status = asynPortDriver::readOctet(pasynUser, value, nChars, nActual,
@@ -152,10 +159,10 @@ asynStatus VMMTbl::readOctet(asynUser *pasynUser, char *value,
   callParamCallbacks();
 
   return asynSuccess;
-  
+
 }
 
-asynStatus VMMTbl::createParamAndStoreInVector(std::string paramName, asynParamType typ, 
+asynStatus VMMTbl::createParamAndStoreInVector(std::string paramName, asynParamType typ,
                                          std::vector<int>* vectorToStore){
 
   int paramIndex;
@@ -174,8 +181,11 @@ asynStatus VMMTbl::createParamAndStoreInVector(std::string paramName, asynParamT
 asynStatus VMMTbl::createEpicsParams() {
 
   createParam("REG_BANK_VERSION", asynParamInt32, &vmmRegBankVersion);
+  createParam("VMM_FEN_ACQUIRE", asynParamInt32, &vmmAcquire_);
+  createParam("VMM_FEN_ACQUIRING", asynParamInt32, &vmmIsAcquiring_);
+  createParam("IOC_MESSAGE", asynParamOctet, &IOCMessage);
 
-  std::tuple<std::string, asynParamType, std::vector<int>*> 
+  std::tuple<std::string, asynParamType, std::vector<int>*>
                               hyb_params_to_create[7] = {{"_FW_VERSION", asynParamOctet, &vmmHybFwVersion_},
                                                     {"_ID", asynParamOctet, &vmmHybId_},
                                                     {"_GEOPOS", asynParamOctet, &vmmHybGeoPos_},
@@ -196,7 +206,7 @@ asynStatus VMMTbl::createEpicsParams() {
     }
 
     std::vector<int> SC, SL, ST, STH, SM, SD, SMX, ADCIDX, ADCVAL;
-    
+
     for (int vmm=0; vmm < VMMS_PER_HYBRID; vmm++) {
 
 
@@ -257,22 +267,28 @@ asynStatus VMMTbl::writeInt32(asynUser *pasynUser, epicsInt32 value) {
 
   asynStatus status = asynSuccess;
   vmmStatus vmm_stat;
+  bool is_acquiring;
   int function = pasynUser->reason;
-  int param_index = -1, hyb_index, vmm_index;
-
-  // if (function == vmmAcquire_) {
-  
-  //   if (value) pVmmAPI->acquire(true);
-  //   else pVmmAPI->acquire(false);
-
-  //   for (int hyb = 0; hyb < number_hybrids; hyb++)
-  //     setIntegerParam(vmmHybLinkStatus_[hyb], std::stoi(pVmmAPI->checkLinkStatus(hyb)));
-  // }
+  int param_index = 0, hyb_index, vmm_index;
 
   if (function < FIRST_VMM_PARAM) {
     return asynPortDriver::writeInt32(pasynUser, value);
   }
 
+  if (function == vmmAcquire_) {
+
+    vmm_stat = this->pVmmAPI->isAcquiring(is_acquiring);
+    if (is_acquiring == (bool)value) {
+      setStringParam(IOCMessage, "Set to acquire/stop but already acquiring/stopped.");
+      status = asynError;
+    } else {
+      this->pVmmAPI->acquire((bool)value);
+    }
+
+    goto endOfWriteInt32;
+
+  }
+
   //Search for parameter in all parameter vectors. If found, execute correct function for specific hybrid.
   param_index = VecUtils::getIndex(vmmHybSkew_, function);
   if (param_index >= 0) {
diff --git a/vmmTblApp/src/vmm_tbl.h b/vmmTblApp/src/vmm_tbl.h
index 307eccd..75c20b9 100644
--- a/vmmTblApp/src/vmm_tbl.h
+++ b/vmmTblApp/src/vmm_tbl.h
@@ -35,6 +35,8 @@ protected:
   int vmmMonitorValueVMM0_;
   int vmmMonitorValueVMM1_;
   int vmmAcquire_;
+  int vmmIsAcquiring_;
+  int IOCMessage;
   std::vector<int> vmmHybFwVersion_;
   std::vector<int> vmmHybId_;
   std::vector<int> vmmHybGeoPos_;
-- 
GitLab