From c7b253b0378e98b2f83f9633410a30bca19ea9a4 Mon Sep 17 00:00:00 2001 From: Hinko Kocevar Date: Wed, 13 Jul 2016 10:43:10 +0200 Subject: [PATCH 1/3] Do not segfault if camera initialization fails in constructor. Move allocation of enum string before calling Andor SDK init. mInitOK is used to avoid divide by zero in setupAcquisition(). --- andorApp/src/andorCCD.cpp | 31 ++++++++++++++++++------------- andorApp/src/andorCCD.h | 2 ++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 7b0cedc..e876efb 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -110,7 +110,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID : ADDriver(portName, 1, NUM_ANDOR_DET_PARAMS, maxBuffers, maxMemory, asynEnumMask, asynEnumMask, ASYN_CANBLOCK, 1, priority, stackSize), - mExiting(false), mShamrockId(shamrockID), mSPEDoc(0) + mExiting(false), mShamrockId(shamrockID), mSPEDoc(0), mInitOK(false) { int status = asynSuccess; @@ -153,6 +153,18 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID return; } + // Initialize ADC enums + for (i=0; i Date: Wed, 13 Jul 2016 11:06:08 +0200 Subject: [PATCH 2/3] Check for shutter support before calling SetShutter(). In order to avoid signaling error if SetShutter() call in setupShutter() would fail. --- andorApp/src/andorCCD.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index e876efb..275ff1b 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -718,6 +718,7 @@ asynStatus AndorCCD::setupShutter(int command) int openTime, closeTime; int shutterExTTL; int shutterMode; + AndorCapabilities capabilities; asynStatus status=asynSuccess; static const char *functionName = "setupShutter"; @@ -750,11 +751,14 @@ asynStatus AndorCCD::setupShutter(int command) } try { - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s:, SetShutter(%d,%d,%d,%d)\n", - driverName, functionName, shutterExTTL, shutterMode, closeTime, openTime); - checkStatus(SetShutter(shutterExTTL, shutterMode, closeTime, openTime)); - + capabilities.ulSize = sizeof(capabilities); + checkStatus(GetCapabilities(&capabilities)); + if (capabilities.ulFeatures & AC_FEATURES_SHUTTER) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s:, SetShutter(%d,%d,%d,%d)\n", + driverName, functionName, shutterExTTL, shutterMode, closeTime, openTime); + checkStatus(SetShutter(shutterExTTL, shutterMode, closeTime, openTime)); + } } catch (const std::string &e) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: %s\n", From 4a566875fdf154bf0e665e8942d188e434604f7d Mon Sep 17 00:00:00 2001 From: Hinko Kocevar Date: Wed, 13 Jul 2016 11:10:26 +0200 Subject: [PATCH 3/3] Provide descriptive error message for not supported features. --- andorApp/src/andorCCD.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 275ff1b..7aa5129 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -850,6 +850,8 @@ unsigned int AndorCCD::checkStatus(unsigned int returnStatus) throw std::string("ERROR: Problem communicating with camera."); } else if (returnStatus == DRV_LOAD_FIRMWARE_ERROR) { throw std::string("ERROR: Error loading firmware."); + } else if (returnStatus == DRV_NOT_SUPPORTED) { + throw std::string("ERROR: Feature not supported."); } else { sprintf(message, "ERROR: Unknown error code=%d returned from Andor SDK.", returnStatus); throw std::string(message);