diff --git a/RELEASE.md b/RELEASE.md index 748dd0f..529bc43 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -22,6 +22,11 @@ files respectively, in the configure/ directory of the appropriate release of th Release Notes ============= +RX-X () +---- +* Added support for Frame Transfer mode. +* Added support for setting the Vertical Shift Period. + R2-6 (July 4, 2017) ---- * Changed from using TinyXml to libxml2. This is used when saving SPE files. This change was made diff --git a/andorApp/Db/andorCCD.template b/andorApp/Db/andorCCD.template index 63b1c4f..441492d 100644 --- a/andorApp/Db/andorCCD.template +++ b/andorApp/Db/andorCCD.template @@ -387,6 +387,40 @@ record(mbbi, "$(P)$(R)AndorReadOutMode_RBV") field(SCAN, "I/O Intr") } +# Frame Transfer Mode +record(bo, "$(P)$(R)AndorFTMode") +{ + field(PINI, "1") + field(DTYP, "asynInt32") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_FT_MODE") +} + +record(bi, "$(P)$(R)AndorFTMode_RBV") +{ + field(DTYP, "asynInt32") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_FT_MODE") + 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 cf7395d..ae4b090 100644 --- a/andorApp/Db/andorCCD_settings.req +++ b/andorApp/Db/andorCCD_settings.req @@ -9,6 +9,8 @@ $(P)$(R)AndorEMGainMode $(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 87e9588..3d97585 100755 --- a/andorApp/src/andorCCD.cpp +++ b/andorApp/src/andorCCD.cpp @@ -153,6 +153,8 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID createParam(AndorAdcSpeedString, asynParamInt32, &AndorAdcSpeed); 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. @@ -181,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. @@ -455,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); @@ -496,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, @@ -1165,6 +1230,16 @@ asynStatus AndorCCD::setupAcquisition() checkStatus(SetEMCCDGain(emGain)); } + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s:, SetFrameTransferMode(%d)\n", + 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 cfa2dec..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" @@ -35,6 +36,8 @@ #define AndorAdcSpeedString "ANDOR_ADC_SPEED" #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. @@ -60,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. * @@ -97,7 +110,9 @@ class AndorCCD : public ADDriver { int AndorAdcSpeed; int AndorBaselineClamp; int AndorReadOutMode; - #define LAST_ANDOR_PARAM AndorReadOutMode + int AndorFrameTransferMode; + int AndorVerticalShiftPeriod; + #define LAST_ANDOR_PARAM AndorVerticalShiftPeriod private: @@ -107,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 @@ -193,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; diff --git a/documentation/andorDoc.html b/documentation/andorDoc.html index 280076e..bd353af 100755 --- a/documentation/andorDoc.html +++ b/documentation/andorDoc.html @@ -48,11 +48,12 @@
  • Support for all of the Andor shutter modes
  • Support for reading the detectors with 16-bit or 32-bit depth
  • Saving files using the Andor SDK and/or with the standard areaDetector plugins
  • -
  • Change the ADC sampling speed (0.05MHz and 2.5MHz on the iKon)
  • +
  • Change the ADC sampling speed (0.05MHz and 2.5MHz on the iKon) and the Vertical Shift Period
  • Set a region of interest (a smaller region can be read out faster)
  • Set and monitor the CCD temperature
  • Electron Multiplying (EM) Gain on supported detectors
  • Support for selecting between Full Vertical Binning (FVB) and Image readout modes
  • +
  • Support for Frame Transfer mode
  • The Andor module includes a separate driver to control the Andor Shamrock spectrographs. @@ -732,6 +733,56 @@ mbbo
    mbbi + + + AndorFTMode + + asynInt32 + + R/W + + Set Frame Transfer mode. Choices are: +

    + Note: Only available on supported CCDs. + + + ANDOR_FT_MODE + + AndorFTMode
    + AndorFTMode_RBV + + bo
    + bi + + + + AndorVSPeriod + + asynInt32 + + R/W + + Sets Vetical Shift Period, in units of microseconds per pixel shift.
    + Choices are constructed at runtime. For example, the choices for an iDus are: + + + ANDOR_VS_PERIOD + + AndorVSPeriod
    + AndorVSPeriod_RBV + + mbbo
    + mbbi +