From 81138d5a18fed14a6c145aed53668826b4858d2d Mon Sep 17 00:00:00 2001 From: Michael Dunning Date: Sun, 5 Nov 2017 18:13:10 -0800 Subject: [PATCH] Add support for Vertical Shift Period --- andorApp/Db/andorCCD.template | 15 ++++++++ andorApp/Db/andorCCD_settings.req | 1 + andorApp/src/andorCCD.cpp | 60 ++++++++++++++++++++++++++++++- andorApp/src/andorCCD.h | 23 +++++++++++- 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index cd0c6c1..441492d 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -406,6 +406,21 @@ record(bi, "$(P)$(R)AndorFTMode_RBV") field(SCAN, "I/O Intr") } +# The Vertical Shift Period enum values are constructed at run-time based on camera capabilities +record(mbbo, "$(P)$(R)AndorVSPeriod") +{ + field(PINI, "1") + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_VS_PERIOD") +} + +record(mbbi, "$(P)$(R)AndorVSPeriod_RBV") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_VS_PERIOD") + field(SCAN, "I/O Intr") +} + #Records in ADBase that do not apply to Andor record(mbbo, "$(P)$(R)ColorMode") diff --git a/andorApp/Db/andorCCD_settings.req b/andorApp/Db/andorCCD_settings.req index f966548..ae4b090 100644 --- a/andorApp/Db/andorCCD_settings.req +++ b/andorApp/Db/andorCCD_settings.req @@ -10,6 +10,7 @@ $(P)$(R)AndorEMGainAdvanced $(P)$(R)AndorADCSpeed $(P)$(R)AndorReadOutMode $(P)$(R)AndorFTMode +$(P)$(R)AndorVSPeriod file "ADBase_settings.req", P=$(P), R=$(R) file "NDFile_settings.req", P=$(P), R=$(R) diff --git a/andorApp/src/andorCCD.cpp b/andorApp/src/andorCCD.cpp index 2ce9a87..1b6140e 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -154,6 +154,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID createParam(AndorBaselineClampString, asynParamInt32, &AndorBaselineClamp); createParam(AndorReadOutModeString, asynParamInt32, &AndorReadOutMode); createParam(AndorFrameTransferModeString, asynParamInt32, &AndorFrameTransferMode); + createParam(AndorVerticalShiftPeriodString, asynParamInt32, &AndorVerticalShiftPeriod); // Create the epicsEvent for signaling to the status task when parameters should have changed. // This will cause it to do a poll immediately, rather than wait for the poll time period. @@ -182,6 +183,12 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID mPreAmpGains[i].EnumString = (char *)calloc(MAX_ENUM_STRING_SIZE, sizeof(char)); } + // Initialize Vertical Shift Period enums + for (i=0; iIndex = i; + pPeriod->Period = VSPeriod; + epicsSnprintf(pPeriod->EnumString, MAX_ENUM_STRING_SIZE, + "%.2f us", VSPeriod); + mNumVSPeriods++; + if (mNumVSPeriods >= MAX_VS_PERIODS) return; + pPeriod++; + } +} /** Report status of the driver. @@ -457,6 +494,8 @@ void AndorCCD::report(FILE *fp, int details) unsigned int uIntParam5; unsigned int uIntParam6; AndorADCSpeed_t *pSpeed; + int vsIndex; + float vsPeriod; static const char *functionName = "report"; fprintf(fp, "Andor CCD port=%s\n", this->portName); @@ -498,6 +537,16 @@ void AndorCCD::report(FILE *fp, int details) fprintf(fp, " Index=%d, Gain=%f\n", mPreAmpGains[i].EnumValue, mPreAmpGains[i].Gain); } + + fprintf(fp, " Vertical Shift Periods available: %d\n", mNumVSPeriods); + for (i=0; ipasynUserSelf, ASYN_TRACE_FLOW, @@ -1175,6 +1228,11 @@ asynStatus AndorCCD::setupAcquisition() driverName, functionName, frameTransferMode); checkStatus(SetFrameTransferMode(frameTransferMode)); + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s:, SetVSSpeed(%d)\n", + driverName, functionName, verticalShiftPeriod); + checkStatus(SetVSSpeed(verticalShiftPeriod)); + switch (imageMode) { case ADImageSingle: if (numExposures == 1) { diff --git a/andorApp/src/andorCCD.h b/andorApp/src/andorCCD.h index 625ab6a..1603fb5 100755 --- a/andorApp/src/andorCCD.h +++ b/andorApp/src/andorCCD.h @@ -20,6 +20,7 @@ #define MAX_ENUM_STRING_SIZE 26 #define MAX_ADC_SPEEDS 16 #define MAX_PREAMP_GAINS 16 +#define MAX_VS_PERIODS 16 #define AndorCoolerParamString "ANDOR_COOLER" #define AndorTempStatusMessageString "ANDOR_TEMP_STAT" @@ -36,6 +37,7 @@ #define AndorBaselineClampString "ANDOR_BASELINE_CLAMP" #define AndorReadOutModeString "ANDOR_READOUT_MODE" #define AndorFrameTransferModeString "ANDOR_FT_MODE" +#define AndorVerticalShiftPeriodString "ANDOR_VS_PERIOD" /** * Structure defining an ADC speed for the ADAndor driver. @@ -61,6 +63,16 @@ typedef struct { int EnumValue; } AndorPreAmpGain_t; +/* + * Structure defining a Vertical Shift Period for the ADAndor driver. + */ +typedef struct { + float Period; + int Index; + char *EnumString; + int EnumValue; +} AndorVSPeriod_t; + /** * Driver for Andor CCD cameras using version 2 of their SDK; inherits from ADDriver class in ADCore. * @@ -99,7 +111,8 @@ class AndorCCD : public ADDriver { int AndorBaselineClamp; int AndorReadOutMode; int AndorFrameTransferMode; - #define LAST_ANDOR_PARAM AndorFrameTransferMode + int AndorVerticalShiftPeriod; + #define LAST_ANDOR_PARAM AndorVerticalShiftPeriod private: @@ -109,6 +122,7 @@ class AndorCCD : public ADDriver { void saveDataFrame(int frameNumber); void setupADCSpeeds(); void setupPreAmpGains(); + void setupVerticalShiftPeriods(); unsigned int SaveAsSPE(char *fullFileName); /** * Additional image mode to those in ADImageMode_t @@ -195,6 +209,13 @@ class AndorCCD : public ADDriver { int mNumPreAmpGains; AndorPreAmpGain_t mPreAmpGains[MAX_PREAMP_GAINS]; + // Vertical Shift Period parameters + int mTotalVSPeriods; + int mNumVSPeriods; + int mVSIndex; + float mVSPeriod; + AndorVSPeriod_t mVSPeriods[MAX_VS_PERIODS]; + //Shutter control parameters float mAcquireTime; float mAcquirePeriod;