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