Merge branch 'master' of https://github.com/areaDetector/ADAndor into fix/wait-for-acquire
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user