diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index 7492dd3c..477cc6ba 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -470,3 +470,28 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(DISA, "1") } + +record(mbbo, "$(P)$(R)AndorFanMode") { + field(PINI, "1") + field(DTYP, "asynInt32") + field(ZRST, "Full") + field(ONST, "Low") + field(TWST, "Off") + field(ZRVL, "0") + field(ONVL, "1") + field(TWVL, "2") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_FAN_MODE") + field(VAL, "0") +} + +record(mbbi, "$(P)$(R)AndorFanMode_RBV") { + field(DTYP, "asynInt32") + field(ZRST, "Full") + field(ONST, "Low") + field(TWST, "Off") + field(ZRVL, "0") + field(ONVL, "1") + field(TWVL, "2") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_FAN_MODE") + field(SCAN, "I/O Intr") +} \ No newline at end of file diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 4ac57cb1..808e29ee 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -160,6 +160,8 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int cameraSeri createParam(AndorFrameTransferModeString, asynParamInt32, &AndorFrameTransferMode); createParam(AndorVerticalShiftPeriodString, asynParamInt32, &AndorVerticalShiftPeriod); createParam(AndorVerticalShiftAmplitudeString, asynParamInt32, &AndorVerticalShiftAmplitude); + createParam(AndorFanModeString, asynParamInt32, &AndorFanMode); + // Create the epicsEvent for signaling to the status task when parameters should have changed. @@ -765,6 +767,19 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value) status = asynError; } } + else if (function == AndorFanMode) { + try { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s:, SetFanMode(%d)\n", + driverName, functionName, value); + checkStatus(SetFanMode(value)); + } catch (const std::string &e) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: %s\n", + driverName, functionName, e.c_str()); + status = asynError; + } + } else { status = ADDriver::writeInt32(pasynUser, value); } @@ -904,25 +919,25 @@ void AndorCCD::setupTrackDefn(int minX, int sizeX, int binX) setIntegerParam(NDArraySizeY, mMultiTrack.DataHeight()); for (size_t TrackNo = 0; TrackNo < mMultiTrack.size(); TrackNo++) { - /* - Each track must be defined by a group of six integers. - - The top and bottom positions of the tracks. - - The left and right positions for the area of interest within each track - - The horizontal and vertical binning for each track. */ - /* - Andor use 1-based exclusive co-ordinates. - e.g. from SDK manual: - 1 2 1 1024 1 1 - 3 4 1 1024 1 1 - 5 6 1 1024 1 1 - 7 8 1 1024 1 1 - 9 10 1 1024 1 1 */ - TrackDefn[TrackNo * 6 + 0] = mMultiTrack.TrackStart(TrackNo) + 1; - TrackDefn[TrackNo * 6 + 1] = mMultiTrack.TrackEnd(TrackNo) + 2; // CCDMultiTrack uses 0-based inlcusive co-ordinates. - TrackDefn[TrackNo * 6 + 2] = minX + 1; - TrackDefn[TrackNo * 6 + 3] = minX + sizeX; - TrackDefn[TrackNo * 6 + 4] = binX; - TrackDefn[TrackNo * 6 + 5] = mMultiTrack.TrackBin(TrackNo); + /* + Each track must be defined by a group of six integers. + - The top and bottom positions of the tracks. + - The left and right positions for the area of interest within each track + - The horizontal and vertical binning for each track. */ + /* + Andor use 1-based exclusive co-ordinates. + e.g. from SDK manual: + 1 2 1 1024 1 1 + 3 4 1 1024 1 1 + 5 6 1 1024 1 1 + 7 8 1 1024 1 1 + 9 10 1 1024 1 1 */ + TrackDefn[TrackNo * 6 + 0] = mMultiTrack.TrackStart(TrackNo) + 1; + TrackDefn[TrackNo * 6 + 1] = mMultiTrack.TrackEnd(TrackNo) + 2; // CCDMultiTrack uses 0-based inlcusive co-ordinates. + TrackDefn[TrackNo * 6 + 2] = minX + 1; + TrackDefn[TrackNo * 6 + 3] = minX + sizeX; + TrackDefn[TrackNo * 6 + 4] = binX; + TrackDefn[TrackNo * 6 + 5] = mMultiTrack.TrackBin(TrackNo); } checkStatus(SetCustomTrackHBin(binX)); checkStatus(SetComplexImage(int(TrackDefn.size() / ValuesPerTrack), &TrackDefn[0])); @@ -1412,8 +1427,8 @@ asynStatus AndorCCD::setupAcquisition() driverName, functionName, verticalShiftPeriod); checkStatus(SetVSSpeed(verticalShiftPeriod)); - if ((mCapabilities.ulSetFunctions & AC_SETFUNCTION_VSAMPLITUDE) != 0) - { + if ((mCapabilities.ulSetFunctions & AC_SETFUNCTION_VSAMPLITUDE) != 0) + { asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s:%s:, SetVSAmplitude(%d)\n", driverName, functionName, verticalShiftAmplitude); diff --git a/andorApp/src/andorCCD.h b/andorApp/src/andorCCD.h index 0dbf2100..c90e6d30 100755 --- a/andorApp/src/andorCCD.h +++ b/andorApp/src/andorCCD.h @@ -41,6 +41,7 @@ #define AndorFrameTransferModeString "ANDOR_FT_MODE" #define AndorVerticalShiftPeriodString "ANDOR_VS_PERIOD" #define AndorVerticalShiftAmplitudeString "ANDOR_VS_AMPLITUDE" +#define AndorFanModeString "ANDOR_FAN_MODE" /** * Structure defining an ADC speed for the ADAndor driver. @@ -117,7 +118,8 @@ class AndorCCD : public ADDriver { int AndorFrameTransferMode; int AndorVerticalShiftPeriod; int AndorVerticalShiftAmplitude; -#define LAST_ANDOR_PARAM AndorVerticalShiftAmplitude + int AndorFanMode; +#define LAST_ANDOR_PARAM AndorFanMode private: diff --git a/docs/ADAndor/andorDoc.rst b/docs/ADAndor/andorDoc.rst index c134d0a7..7d7b946f 100644 --- a/docs/ADAndor/andorDoc.rst +++ b/docs/ADAndor/andorDoc.rst @@ -391,7 +391,15 @@ those in asynNDArrayDriver.h and ADDriver.h. - ANDOR_VS_PERIOD - AndorVSPeriod, AndorVSPeriod_RBV - mbbo, mbbi - + + * - Fan Mode Settings. Choices are: + + - Full + - Low + - Off + - ANDOR_FAN_MODE + - AndorFanMode + - mbbo, mbbi Unsupported standard driver parameters --------------------------------------