From bc6913f106cd258ed54a4420dc1c08f89019d425 Mon Sep 17 00:00:00 2001 From: SourabhHalli <126074466+SourabhHalli@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:37:29 +0100 Subject: [PATCH 1/5] adding fan controls --- andorApp/src/andorCCD.cpp | 57 ++++++++++++++++++++++++--------------- andorApp/src/andorCCD.h | 3 +++ docs/ADAndor/andorDoc.rst | 10 ++++++- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 4ac57cb1..50d990c2 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -765,6 +765,21 @@ 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)); + // Mirroring as there is no readback + setIntegerParam(AndorFanMode_RBV, 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..b097e82a 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,6 +118,8 @@ class AndorCCD : public ADDriver { int AndorFrameTransferMode; int AndorVerticalShiftPeriod; int AndorVerticalShiftAmplitude; + int AndorFanMode; + int AndorFanMode_RBV; #define LAST_ANDOR_PARAM AndorVerticalShiftAmplitude private: diff --git a/docs/ADAndor/andorDoc.rst b/docs/ADAndor/andorDoc.rst index c134d0a7..e4cca862 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, AndorFanMode_RBV + - mbbo, mbbi Unsupported standard driver parameters -------------------------------------- From 68b9717842e4d4b4c1298f4c31cf41c38d6219c1 Mon Sep 17 00:00:00 2001 From: SourabhHalli <126074466+SourabhHalli@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:39:27 +0100 Subject: [PATCH 2/5] adding pvs to template --- andorApp/Db/andorCCD.template | 22 ++++++++++++++++++++++ andorApp/src/andorCCD.cpp | 2 ++ andorApp/src/andorCCD.h | 4 ++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index 7492dd3c..12e4a3fa 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -470,3 +470,25 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(DISA, "1") } + +record(mbbo, "$(P)$(R)FanMode") { + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),0,0)ANDOR_FAN_MODE") + field(ZRST, "Full") + field(ONST, "Low") + field(TWST, "Off") + field(ZRVL, "0") + field(ONVL, "1") + field(TWVL, "2") +} + +record(mbbi, "$(P)$(R)FanMode_RBV") { + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),0,0)ANDOR_FAN_MODE_RBV") + field(ZRST, "Full") + field(ONST, "Low") + field(TWST, "Off") + field(ZRVL, "0") + field(ONVL, "1") + field(TWVL, "2") +} \ No newline at end of file diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 50d990c2..3e8b8c5d 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. diff --git a/andorApp/src/andorCCD.h b/andorApp/src/andorCCD.h index b097e82a..6cc75c6c 100755 --- a/andorApp/src/andorCCD.h +++ b/andorApp/src/andorCCD.h @@ -41,7 +41,7 @@ #define AndorFrameTransferModeString "ANDOR_FT_MODE" #define AndorVerticalShiftPeriodString "ANDOR_VS_PERIOD" #define AndorVerticalShiftAmplitudeString "ANDOR_VS_AMPLITUDE" -#define AndorFanModeString "ANDOR_FAN_MODE" +#define AndorFanModeString "ANDOR_FAN_MODE" /** * Structure defining an ADC speed for the ADAndor driver. @@ -120,7 +120,7 @@ class AndorCCD : public ADDriver { int AndorVerticalShiftAmplitude; int AndorFanMode; int AndorFanMode_RBV; -#define LAST_ANDOR_PARAM AndorVerticalShiftAmplitude +#define LAST_ANDOR_PARAM AndorFanMode_RBV private: From 2b4c1b69b57c0ca012b7e6746195da6122dd8ac9 Mon Sep 17 00:00:00 2001 From: SourabhHalli <126074466+SourabhHalli@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:08:59 +0100 Subject: [PATCH 3/5] fix for error setting param --- andorApp/Db/andorCCD.template | 7 +++++-- andorApp/src/andorCCD.cpp | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index 12e4a3fa..75910f9e 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -472,23 +472,26 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") } record(mbbo, "$(P)$(R)FanMode") { + field(PINI, "1") field(DTYP, "asynInt32") - field(OUT, "@asyn($(PORT),0,0)ANDOR_FAN_MODE") 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)FanMode_RBV") { field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),0,0)ANDOR_FAN_MODE_RBV") 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_RBV") + field(SCAN, "I/O Intr") } \ No newline at end of file diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 3e8b8c5d..2f6ebbb8 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -161,6 +161,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int cameraSeri createParam(AndorVerticalShiftPeriodString, asynParamInt32, &AndorVerticalShiftPeriod); createParam(AndorVerticalShiftAmplitudeString, asynParamInt32, &AndorVerticalShiftAmplitude); createParam(AndorFanModeString, asynParamInt32, &AndorFanMode); + createParam("ANDOR_FAN_MODE_RBV", asynParamInt32, &AndorFanMode_RBV); From e353ec2986109e4e5adec3cca74c07e214e6f243 Mon Sep 17 00:00:00 2001 From: SourabhHalli <126074466+SourabhHalli@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:49:43 +0100 Subject: [PATCH 4/5] renaming PVs --- andorApp/Db/andorCCD.template | 4 ++-- andorApp/src/andorCCD.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index 75910f9e..b5b75f97 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -471,7 +471,7 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") field(DISA, "1") } -record(mbbo, "$(P)$(R)FanMode") { +record(mbbo, "$(P)$(R)AndorFanMode") { field(PINI, "1") field(DTYP, "asynInt32") field(ZRST, "Full") @@ -484,7 +484,7 @@ record(mbbo, "$(P)$(R)FanMode") { field(VAL, "0") } -record(mbbi, "$(P)$(R)FanMode_RBV") { +record(mbbi, "$(P)$(R)AndorFanMode_RBV") { field(DTYP, "asynInt32") field(ZRST, "Full") field(ONST, "Low") diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 2f6ebbb8..58d58644 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -161,7 +161,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int cameraSeri createParam(AndorVerticalShiftPeriodString, asynParamInt32, &AndorVerticalShiftPeriod); createParam(AndorVerticalShiftAmplitudeString, asynParamInt32, &AndorVerticalShiftAmplitude); createParam(AndorFanModeString, asynParamInt32, &AndorFanMode); - createParam("ANDOR_FAN_MODE_RBV", asynParamInt32, &AndorFanMode_RBV); + createParam("ANDOR_FAN_MODE_RBV", asynParamInt32, &AndorFanMode_RBV); From 962902a57ca1bd2c94bb9bb6b5dea35dbe869065 Mon Sep 17 00:00:00 2001 From: SourabhHalli <126074466+SourabhHalli@users.noreply.github.com> Date: Thu, 28 May 2026 16:42:36 +0100 Subject: [PATCH 5/5] removing fanmode rbv --- andorApp/Db/andorCCD.template | 2 +- andorApp/src/andorCCD.cpp | 3 --- andorApp/src/andorCCD.h | 3 +-- docs/ADAndor/andorDoc.rst | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index b5b75f97..477cc6ba 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -492,6 +492,6 @@ record(mbbi, "$(P)$(R)AndorFanMode_RBV") { field(ZRVL, "0") field(ONVL, "1") field(TWVL, "2") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_FAN_MODE_RBV") + 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 58d58644..808e29ee 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -161,7 +161,6 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int cameraSeri createParam(AndorVerticalShiftPeriodString, asynParamInt32, &AndorVerticalShiftPeriod); createParam(AndorVerticalShiftAmplitudeString, asynParamInt32, &AndorVerticalShiftAmplitude); createParam(AndorFanModeString, asynParamInt32, &AndorFanMode); - createParam("ANDOR_FAN_MODE_RBV", asynParamInt32, &AndorFanMode_RBV); @@ -774,8 +773,6 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value) "%s:%s:, SetFanMode(%d)\n", driverName, functionName, value); checkStatus(SetFanMode(value)); - // Mirroring as there is no readback - setIntegerParam(AndorFanMode_RBV, value); } catch (const std::string &e) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: %s\n", diff --git a/andorApp/src/andorCCD.h b/andorApp/src/andorCCD.h index 6cc75c6c..c90e6d30 100755 --- a/andorApp/src/andorCCD.h +++ b/andorApp/src/andorCCD.h @@ -119,8 +119,7 @@ class AndorCCD : public ADDriver { int AndorVerticalShiftPeriod; int AndorVerticalShiftAmplitude; int AndorFanMode; - int AndorFanMode_RBV; -#define LAST_ANDOR_PARAM AndorFanMode_RBV +#define LAST_ANDOR_PARAM AndorFanMode private: diff --git a/docs/ADAndor/andorDoc.rst b/docs/ADAndor/andorDoc.rst index e4cca862..7d7b946f 100644 --- a/docs/ADAndor/andorDoc.rst +++ b/docs/ADAndor/andorDoc.rst @@ -398,7 +398,7 @@ those in asynNDArrayDriver.h and ADDriver.h. - Low - Off - ANDOR_FAN_MODE - - AndorFanMode, AndorFanMode_RBV + - AndorFanMode - mbbo, mbbi Unsupported standard driver parameters