From 634c3b12baf893fad366fc62cda2f6c1afa72863 Mon Sep 17 00:00:00 2001 From: marcofilho Date: Mon, 26 Aug 2024 16:17:55 +0200 Subject: [PATCH] Fix false warning raise. Fix concurrency problem. Before this commit, if acquisition was aborted by user before the imagetask had passed through the conditional `if ((epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime)`, condition would evaluate to true and raise a warning saying that the acquisition timed out, which is not true. After this, condition evaluates to false and no alarm is raised. Tested several acquisitions and this does not seem to compromise the control flow. It seems to work both with internal and with external triggers. --- ADOrcaApp/src/orca.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index 004243f..63fb45e 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -779,6 +779,7 @@ void Orca::imageTask(){ int evr_counts_since_last_start = 0; int evr_counts_since_last_start_previous = 0; int evr_trigger_dropped = 0; + int acqStatus; uint64_t prevAcquisitionCount = 0; DCAMCAP_TRANSFERINFO captransferinfo; epicsTimeStamp prevAcqTime, currentAcqTime; @@ -929,10 +930,12 @@ void Orca::imageTask(){ getDoubleParam(ADAcquirePeriod, &acqusitionRate); + getIntegerParam(ADStatus, &acqStatus); maxAcqusitionTime = acqusitionRate * 2; epicsTimeGetCurrent(¤tAcqTime); - if (epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime) { - printf("[DEBUG]::maxAcqusitionTime %f\n", maxAcqusitionTime); + if ((epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime) && + acqStatus != ADStatusAborted) { + printf("[DEBUG]::maxAcqusitionTime %f\n", maxAcqusitionTime); setShutter(0); stopAcquire(); setIntegerParam(ADAcquire, 0);