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().
This commit is contained in:
Hinko Kocevar
2016-07-13 10:43:10 +02:00
parent cbaf6021fc
commit c7b253b037
2 changed files with 20 additions and 13 deletions

View File

@@ -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<MAX_ADC_SPEEDS; i++) {
mADCSpeeds[i].EnumValue = i;
mADCSpeeds[i].EnumString = (char *)calloc(MAX_ENUM_STRING_SIZE, sizeof(char));
}
// Initialize Pre-Amp enums
for (i=0; i<MAX_PREAMP_GAINS; i++) {
mPreAmpGains[i].EnumValue = i;
mPreAmpGains[i].EnumString = (char *)calloc(MAX_ENUM_STRING_SIZE, sizeof(char));
}
// Initialize camera
try {
printf("%s:%s: initializing camera\n",
@@ -172,18 +184,6 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID
return;
}
// Initialize ADC enums
for (i=0; i<MAX_ADC_SPEEDS; i++) {
mADCSpeeds[i].EnumValue = i;
mADCSpeeds[i].EnumString = (char *)calloc(MAX_ENUM_STRING_SIZE, sizeof(char));
}
// Initialize Pre-Amp enums
for (i=0; i<MAX_PREAMP_GAINS; i++) {
mPreAmpGains[i].EnumValue = i;
mPreAmpGains[i].EnumString = (char *)calloc(MAX_ENUM_STRING_SIZE, sizeof(char));
}
/* Set some default values for parameters */
status = setStringParam(ADManufacturer, "Andor");
@@ -265,6 +265,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID
return;
}
printf("CCD initialized OK!\n");
mInitOK = true;
}
/**
@@ -969,6 +970,10 @@ asynStatus AndorCCD::setupAcquisition()
AndorADCSpeed_t *pSpeed;
static const char *functionName = "setupAcquisition";
if (!mInitOK) {
return asynDisabled;
}
getIntegerParam(ADImageMode, &imageMode);
getIntegerParam(ADNumExposures, &numExposures);
if (numExposures <= 0) {

View File

@@ -196,6 +196,8 @@ class AndorCCD : public ADDriver {
tagCSMAHEAD *mSPEHeader;
TiXmlDocument *mSPEDoc;
// Camera init status
bool mInitOK;
};
#define NUM_ANDOR_DET_PARAMS ((int)(&LAST_ANDOR_PARAM - &FIRST_ANDOR_PARAM + 1))