Merge branch 'master' into epics_shutter

This commit is contained in:
Mark Rivers
2017-01-09 10:29:44 -06:00
7 changed files with 5461 additions and 5357 deletions

View File

@@ -33,6 +33,8 @@ R2-5 (January XXX, 2017)
* Fixed bug with AndorPreAmpGain; previously it was not actually calling SetPreAmpGain().
* Added support for SerialNumber, FirmwareVersion, SDKVersion, DriverVersion, and ADCoreVersion which
were added in ADCore R2-6.
* Add support for Full Vertical Binning (FVB) readout mode.
Thanks to Hinko Kocevar for this.
R2-4 (September 15, 2015)
----

View File

@@ -358,6 +358,29 @@ record(bi, "$(P)$(R)AndorEMGainAdvanced_RBV")
field(SCAN, "I/O Intr")
}
record(mbbo, "$(P)$(R)AndorReadOutMode")
{
field(PINI, "YES")
field(DTYP, "asynInt32")
field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_READOUT_MODE")
field(ZRST, "FVB")
field(ZRVL, "0")
field(ONST, "Image")
field(ONVL, "4")
field(VAL, "4")
}
record(mbbi, "$(P)$(R)AndorReadOutMode_RBV")
{
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))ANDOR_READOUT_MODE")
field(ZRST, "FVB")
field(ZRVL, "0")
field(ONST, "Image")
field(ONVL, "4")
field(SCAN, "I/O Intr")
}
#Records in ADBase that do not apply to Andor
record(mbbo, "$(P)$(R)ColorMode")

View File

@@ -5,6 +5,7 @@ $(P)$(R)AndorShutterExTTL
$(P)$(R)PALFilePath
$(P)$(R)AndorPreAmpGain
$(P)$(R)AndorADCSpeed
$(P)$(R)AndorReadOutMode
file "ADBase_settings.req", P=$(P), R=$(R)
file "NDFile_settings.req", P=$(P), R=$(R)

File diff suppressed because it is too large Load Diff

View File

@@ -152,6 +152,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID
createParam(AndorEmGainAdvancedString, asynParamInt32, &AndorEmGainAdvanced);
createParam(AndorAdcSpeedString, asynParamInt32, &AndorAdcSpeed);
createParam(AndorBaselineClampString, asynParamInt32, &AndorBaselineClamp);
createParam(AndorReadOutModeString, asynParamInt32, &AndorReadOutMode);
// 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.
@@ -247,6 +248,7 @@ AndorCCD::AndorCCD(const char *portName, const char *installPath, int shamrockID
status |= setIntegerParam(AndorShutterMode, AShutterAuto);
status |= setDoubleParam(ADShutterOpenDelay, 0.);
status |= setDoubleParam(ADShutterCloseDelay, 0.);
status |= setIntegerParam(AndorReadOutMode, ARImage);
setupADCSpeeds();
setupPreAmpGains();
@@ -580,7 +582,8 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value)
(function == ADReverseX) || (function == ADReverseY) ||
(function == ADTriggerMode) || (function == AndorEmGain) ||
(function == AndorEmGainMode)|| (function == AndorEmGainAdvanced) ||
(function == AndorAdcSpeed) || (function == AndorPreAmpGain)) {
(function == AndorAdcSpeed) || (function == AndorPreAmpGain) ||
(function == AndorReadOutMode)) {
status = setupAcquisition();
if (function == AndorAdcSpeed) setupPreAmpGains();
if (status != asynSuccess) setIntegerParam(function, oldValue);
@@ -737,7 +740,6 @@ asynStatus AndorCCD::setupShutter(int command)
int shutterExTTL;
int adShutterMode;
int shutterMode;
AndorCapabilities capabilities;
asynStatus status=asynSuccess;
static const char *functionName = "setupShutter";
@@ -778,9 +780,7 @@ asynStatus AndorCCD::setupShutter(int command)
}
try {
capabilities.ulSize = sizeof(capabilities);
checkStatus(GetCapabilities(&capabilities));
if (capabilities.ulFeatures & AC_FEATURES_SHUTTER) {
if (mCapabilities.ulFeatures & AC_FEATURES_SHUTTER) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetShutter(%d,%d,%d,%d)\n",
driverName, functionName, shutterExTTL, shutterMode, closeTime, openTime);
@@ -1005,12 +1005,15 @@ asynStatus AndorCCD::setupAcquisition()
int emGainAdvanced;
int FKOffset;
AndorADCSpeed_t *pSpeed;
int readOutMode;
static const char *functionName = "setupAcquisition";
if (!mInitOK) {
return asynDisabled;
}
// Get current readout mode
getIntegerParam(AndorReadOutMode, &readOutMode);
getIntegerParam(ADImageMode, &imageMode);
getIntegerParam(ADNumExposures, &numExposures);
if (numExposures <= 0) {
@@ -1057,6 +1060,11 @@ asynStatus AndorCCD::setupAcquisition()
getIntegerParam(ADReverseY, &reverseY);
getIntegerParam(ADMaxSizeX, &maxSizeX);
getIntegerParam(ADMaxSizeY, &maxSizeY);
if (readOutMode == ARFullVerticalBinning) {
// Set maximum binning but do not update parameter, this preserves ADBinY
// when going back to Image readout mode.
binY = maxSizeY;
}
if (minX > (maxSizeX - binX)) {
minX = maxSizeX - binX;
setIntegerParam(ADMinX, minX);
@@ -1088,6 +1096,11 @@ asynStatus AndorCCD::setupAcquisition()
setIntegerParam(NDArraySizeY, sizeY/binY);
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetReadMode(%d)\n",
driverName, functionName, readOutMode);
checkStatus(SetReadMode(readOutMode));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetTriggerMode(%d)\n",
driverName, functionName, triggerMode);
@@ -1118,16 +1131,18 @@ asynStatus AndorCCD::setupAcquisition()
driverName, functionName, reverseX, reverseY);
checkStatus(SetImageFlip(reverseX, reverseY));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetImage(%d,%d,%d,%d,%d,%d)\n",
driverName, functionName, binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY);
checkStatus(SetImage(binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY));
if (readOutMode == ARImage) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetImage(%d,%d,%d,%d,%d,%d)\n",
driverName, functionName, binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY);
checkStatus(SetImage(binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY));
}
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetExposureTime(%f)\n",
driverName, functionName, mAcquireTime);
checkStatus(SetExposureTime(mAcquireTime));
// Check if camera has EM gain capability before setting modes or EM gain
if ((int)mCapabilities.ulEMGainCapability > 0) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
@@ -1135,21 +1150,21 @@ asynStatus AndorCCD::setupAcquisition()
driverName, functionName, emGainMode);
checkStatus(SetEMGainMode(emGainMode));
}
if ((int)mCapabilities.ulEMGainCapability > 0) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetEMGainAdvanced(%d)\n",
driverName, functionName, emGainAdvanced);
checkStatus(SetEMAdvanced(emGainAdvanced));
}
if ((int)mCapabilities.ulEMGainCapability > 0) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, SetEMCCDGain(%d)\n",
driverName, functionName, emGain);
checkStatus(SetEMCCDGain(emGain));
}
switch (imageMode) {
case ADImageSingle:
if (numExposures == 1) {

View File

@@ -33,6 +33,7 @@
#define AndorEmGainAdvancedString "ANDOR_EM_GAIN_ADVANCED"
#define AndorAdcSpeedString "ANDOR_ADC_SPEED"
#define AndorBaselineClampString "ANDOR_BASELINE_CLAMP"
#define AndorReadOutModeString "ANDOR_READOUT_MODE"
/**
* Structure defining an ADC speed for the ADAndor driver.
@@ -94,7 +95,8 @@ class AndorCCD : public ADDriver {
int AndorEmGainAdvanced;
int AndorAdcSpeed;
int AndorBaselineClamp;
#define LAST_ANDOR_PARAM AndorBaselineClamp
int AndorReadOutMode;
#define LAST_ANDOR_PARAM AndorReadOutMode
private:

View File

@@ -10,7 +10,7 @@
<h1>
areaDetector Andor driver</h1>
<h2>
April 16, 2014</h2>
July 13, 2016</h2>
<h2>
Matthew Pearson, Oak Ridge National Laboratory</h2>
<h2>
@@ -52,6 +52,7 @@
<li>Set a region of interest (a smaller region can be read out faster)</li>
<li>Set and monitor the CCD temperature</li>
<li>Electron Multiplying (EM) Gain on supported detectors</li>
<li>Support for selecting between Full Vertical Binning (FVB) and Image readout modes</li>
</ul>
<p>
The Andor module includes a separate driver to control the Andor Shamrock spectrographs.
@@ -613,7 +614,7 @@
ANDOR_BASELINE_CLAMP</td>
<td>
AndorBaselineClamp<br />
AndorBaselineClamp_RBV</td>
AndorBaselineClamp_RBV</td>
<td>
bo<br />
bi</td>
@@ -690,6 +691,29 @@
bo<br />
bi</td>
</tr>
<tr>
<td>
AndorReadOutMode</td>
<td>
asynInt32</td>
<td>
R/W</td>
<td>
Switch between the readout modes. Choices are:
<ul>
<li>Full Vertical Binning (FVB)</li>
<li>Image</li>
</ul>
</td>
<td>
ANDOR_READOUT_MODE</td>
<td>
AndorReadOutMode<br />
AndorReadOutMode_RBV</td>
<td>
mbbo<br />
mbbi</td>
</tr>
</tbody>
</table>
<h2 id="Unsupported" style="text-align: left">
@@ -955,6 +979,7 @@
file writers do not save the calibration, and it is not possible to pass the calibration
to other file plugins as an attribute because array attributes are not currently
supported in areaDetector.</li>
<li>Single-Track, Multi-Track and Random-Track readout modes are not yet supported.</li>
</ul>
</body>
</html>