Merge branch 'master' of https://github.com/areaDetector/ADAndor into fix/wait-for-acquire

This commit is contained in:
Benjamin Bradnick
2020-03-05 08:59:31 +00:00

View File

@@ -241,6 +241,13 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int cameraSeri
checkStatus(GetFastestRecommendedVSSpeed(&mVSIndex, &mVSPeriod));
mCapabilities.ulSize = sizeof(mCapabilities);
checkStatus(GetCapabilities(&mCapabilities));
/* Get current temperature */
float temperature;
checkStatus(GetTemperatureF(&temperature));
printf("%s:%s: current temperature is %f\n", driverName, functionName, temperature);
setDoubleParam(ADTemperature, temperature);
callParamCallbacks();
} catch (const std::string &e) {
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
@@ -400,31 +407,36 @@ void AndorCCD::setupPreAmpGains()
char *enumStrings[MAX_PREAMP_GAINS];
int enumValues[MAX_PREAMP_GAINS];
int enumSeverities[MAX_PREAMP_GAINS];
static const char *functionName = "setupPreAmpGains";
mNumPreAmpGains = 0;
getIntegerParam(AndorAdcSpeed, &adcSpeed);
pSpeed = &mADCSpeeds[adcSpeed];
for (i=0; i<mTotalPreAmpGains; i++) {
checkStatus(IsPreAmpGainAvailable(pSpeed->ADCIndex, pSpeed->AmpIndex, pSpeed->HSSpeedIndex,
i, &isAvailable));
if (isAvailable) {
checkStatus(GetPreAmpGain(i, &gain));
epicsSnprintf(pGain->EnumString, MAX_ENUM_STRING_SIZE, "%.2f", gain);
pGain->EnumValue = i;
pGain->Gain = gain;
mNumPreAmpGains++;
if (mNumPreAmpGains >= MAX_PREAMP_GAINS) break;
pGain++;
try{
for (i=0; i<mTotalPreAmpGains; i++) {
checkStatus(IsPreAmpGainAvailable(pSpeed->ADCIndex, pSpeed->AmpIndex, pSpeed->HSSpeedIndex,
i, &isAvailable));
if (isAvailable) {
checkStatus(GetPreAmpGain(i, &gain));
epicsSnprintf(pGain->EnumString, MAX_ENUM_STRING_SIZE, "%.2f", gain);
pGain->EnumValue = i;
pGain->Gain = gain;
mNumPreAmpGains++;
if (mNumPreAmpGains >= MAX_PREAMP_GAINS) break;
pGain++;
}
}
for (i=0; i<mNumPreAmpGains; i++) {
enumStrings[i] = mPreAmpGains[i].EnumString;
enumValues[i] = mPreAmpGains[i].EnumValue;
enumSeverities[i] = 0;
}
doCallbacksEnum(enumStrings, enumValues, enumSeverities,
mNumPreAmpGains, AndorPreAmpGain, 0);
} catch (const std::string &e) {
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: %s\n", driverName, functionName, e.c_str());
}
for (i=0; i<mNumPreAmpGains; i++) {
enumStrings[i] = mPreAmpGains[i].EnumString;
enumValues[i] = mPreAmpGains[i].EnumValue;
enumSeverities[i] = 0;
}
doCallbacksEnum(enumStrings, enumValues, enumSeverities,
mNumPreAmpGains, AndorPreAmpGain, 0);
}
asynStatus AndorCCD::readEnum(asynUser *pasynUser, char *strings[], int values[], int severities[],
@@ -782,6 +794,10 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
int minTemp = 0;
int maxTemp = 0;
/* Store the old value */
epicsFloat64 oldValue;
getDoubleParam(function, &oldValue);
/* Set the parameter and readback in the parameter library. */
status = setDoubleParam(function, value);
@@ -802,16 +818,21 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
"%s:%s:, Setting temperature value %f\n",
driverName, functionName, value);
try {
/* Check requested temperature is within our range */
checkStatus(GetTemperatureRange(&minTemp, &maxTemp));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, CCD Min Temp: %d, Max Temp %d\n",
driverName, functionName, minTemp, maxTemp);
checkStatus(GetTemperatureRange(&minTemp, &maxTemp));
if ((static_cast<int>(value) > minTemp) & (static_cast<int>(value) < maxTemp)) {
if ((static_cast<int>(value) >= minTemp) & (static_cast<int>(value) <= maxTemp)) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetTemperature(%d)\n",
driverName, functionName, static_cast<int>(value));
checkStatus(SetTemperature(static_cast<int>(value)));
} else {
/* Requested temperature is out of range */
status = setDoubleParam(function, oldValue);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"Requested temperature out of range\n");
setStringParam(AndorMessage, "Temperature is out of range.");
callParamCallbacks();
status = asynError;
@@ -827,24 +848,24 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
(function == ADShutterCloseDelay)) {
status = setupShutter(-1);
}
else {
status = ADDriver::writeFloat64(pasynUser, value);
}
// For a successful write, clear the error message.
setStringParam(AndorMessage, " ");
/* Do callbacks so higher layers see any changes */
callParamCallbacks();
if (status)
if (status) {
asynPrint(pasynUser, ASYN_TRACE_ERROR,
"%s:%s: error, status=%d function=%d, value=%f\n",
driverName, functionName, status, function, value);
else
}
else {
asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
"%s:%s: function=%d, value=%f\n",
driverName, functionName, function, value);
/* For a successful write, clear the error message. */
setStringParam(AndorMessage, " ");
}
return status;
}