diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 9eda11f..39c1aa7 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -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; iADCIndex, 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; iADCIndex, 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; ipasynUserSelf, ASYN_TRACE_FLOW, "%s:%s:, CCD Min Temp: %d, Max Temp %d\n", driverName, functionName, minTemp, maxTemp); - checkStatus(GetTemperatureRange(&minTemp, &maxTemp)); - if ((static_cast(value) > minTemp) & (static_cast(value) < maxTemp)) { + if ((static_cast(value) >= minTemp) & (static_cast(value) <= maxTemp)) { asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s:%s:, SetTemperature(%d)\n", driverName, functionName, static_cast(value)); checkStatus(SetTemperature(static_cast(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; }