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:
1 parent
cbaf6021fc
commit
c7b253b037
2 files changed
+20
-13
No files matched your search
+18
-13
@@ -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) {
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in new issue
Block a user