From ab61e952e19e4e49e9b45975a11edb4a043ecaa0 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 14 Sep 2022 10:30:57 +0200 Subject: [PATCH 1/2] Add mutex control --- ADHamaApp/src/hama.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index c492afe..bb07622 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -496,12 +496,17 @@ epicsTimeStamp imageStamp; //static const char *functionName = "imageTask"; + lock(); + while(1) { getIntegerParam(ADAcquire, &acquire); if(!acquire) { - puts("Waitng start"); + puts("Waiting start"); + + unlock(); status = epicsEventWait(startAcquireEventId_); puts("Starting request received"); + lock(); /* We are acquiring. */ //acquireStatusError = 0; @@ -520,7 +525,7 @@ epicsTimeStamp imageStamp; epicsTimeGetCurrent(&startTime); prevAcquisitionCount = 0; } - } + } eventStatus = epicsEventWaitWithTimeout(this->stopAcquireEventId_, 0); /* Stop event detected */ @@ -536,7 +541,9 @@ epicsTimeStamp imageStamp; epicsThreadSleep(0.001); // get image transfer status. + unlock(); imageTransferStatus(m_hdcam, captransferinfo); + lock(); if (prevAcquisitionCount < captransferinfo.nFrameCount) { //printf("nFrameCount: %d, nNewestFrameIndex: %d\n", captransferinfo.nFrameCount, captransferinfo.nNewestFrameIndex); From 1a87d62bc5e996a9fed67f8bd9d2d7aee161cdf7 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 14 Sep 2022 16:33:03 +0200 Subject: [PATCH 2/2] Remove stopEvent signal, because the mutex lock control the acq thread loop --- ADHamaApp/src/hama.cpp | 29 +++++------------------------ ADHamaApp/src/hama.h | 3 +-- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index bb07622..e5c3c92 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -52,20 +52,13 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, stopThread = 0; /* Create the epicsEvents for signaling to task when acquisition starts and stops */ - startAcquireEventId_ = epicsEventCreate(epicsEventEmpty); - if (!startAcquireEventId_) { + startEvent_ = epicsEventCreate(epicsEventEmpty); + if (!startEvent_) { printf("%s:%s epicsEventCreate failure for acquire start event\n", driverName, functionName); return; } - stopAcquireEventId_ = epicsEventCreate(epicsEventEmpty); - if (!stopAcquireEventId_) { - printf("%s:%s epicsEventCreate failure for acquire stop event\n", - driverName, functionName); - return; - } - //General createParam( HamaName, asynParamOctet, &hHamaName); @@ -504,7 +497,7 @@ epicsTimeStamp imageStamp; puts("Waiting start"); unlock(); - status = epicsEventWait(startAcquireEventId_); + status = epicsEventWait(startEvent_); puts("Starting request received"); lock(); @@ -515,7 +508,6 @@ epicsTimeStamp imageStamp; status = startAcquire(); printf("Status: %d\n", status); if (status != asynSuccess) { - epicsEventSignal(this->stopAcquireEventId_); acquireStatusError = 1; epicsThreadSleep(.1); } @@ -525,16 +517,6 @@ epicsTimeStamp imageStamp; epicsTimeGetCurrent(&startTime); prevAcquisitionCount = 0; } - } - - eventStatus = epicsEventWaitWithTimeout(this->stopAcquireEventId_, 0); - /* Stop event detected */ - if (eventStatus == epicsEventWaitOK) { - setShutter(0); - setIntegerParam(ADAcquire, 0); - acquire=0; - callParamCallbacks(); - continue; } /* Added this delay for the thread not to hog the processor. No need to run on full speed. */ @@ -660,12 +642,11 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ if (value) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); - epicsEventSignal(this->startAcquireEventId_); + epicsEventSignal(this->startEvent_); } else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError)) { /* This was a command to stop acquisition */ - puts("Requested acquire stop event. Sending acquire stop event signal to thread"); - epicsEventSignal(this->stopAcquireEventId_); + setShutter(0); stopAcquire(); } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index b403794..a336d4c 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -264,8 +264,7 @@ private: int m_id; int stopThread; - epicsEventId startAcquireEventId_; - epicsEventId stopAcquireEventId_; + epicsEventId startEvent_; asynStatus startAcquire(void); asynStatus stopAcquire(void);