Updated; made XHTML compliant
git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@7631 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
This commit is contained in:
+13
-12
@@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html lang="en-us">
|
||||
<html lang="en-us" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>areaDetector ADSC driver</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -70,16 +70,17 @@ following signature:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><tt>int adscConfig(const char *portName, const char *modelName)</tt></dt>
|
||||
<dd>
|
||||
<dl>
|
||||
<dt><tt>portName</tt></dt>
|
||||
<dd>ASYN port name for the driver instance</dd>
|
||||
<dt><tt>modelName</tt></dt>
|
||||
<dd>ADSC detector model name; must be one of <tt>Q4</tt>, <tt>Q4r</tt>,
|
||||
<tt>Q210</tt>, <tt>Q210r</tt>, <tt>Q270</tt>, <tt>Q315</tt>,
|
||||
<tt>Q315r</tt></dd>
|
||||
</dl>
|
||||
<dt><tt>int adscConfig(const char *portName, const char *modelName)</tt></dt>
|
||||
<dd>
|
||||
<dl>
|
||||
<dt><tt>portName</tt></dt>
|
||||
<dd>ASYN port name for the driver instance</dd>
|
||||
<dt><tt>modelName</tt></dt>
|
||||
<dd>ADSC detector model name; must be one of <tt>Q4</tt>, <tt>Q4r</tt>,
|
||||
<tt>Q210</tt>, <tt>Q210r</tt>, <tt>Q270</tt>, <tt>Q315</tt>,
|
||||
<tt>Q315r</tt></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
|
||||
+1301
-1233
File diff suppressed because it is too large
Load Diff
@@ -1,57 +1,58 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>areaDetectorReleaseNotes.html</title>
|
||||
</head>
|
||||
|
||||
<h1 align="center">areaDetector Release Notes</h1>
|
||||
<h2 align="center">Release 1-2 (xxx-June-2008)</h2>
|
||||
<ul>
|
||||
<li>Major update to documentation
|
||||
<li>Significant enhancement to ROI plugin. Added net counts, ROI highlighting.
|
||||
<li>Added driver for Pilatus detectors
|
||||
<li>Added driver for ADSC detectors (done by Lewis Muir, IMCA-CAT)
|
||||
<li>Renamed asynParamBase to asynPortDriver.
|
||||
<li>Renamed NDArrayBase to NDArrayDriver
|
||||
<li>Renamed NDPluginBase to NDPluginDriver
|
||||
<li>Renamed NDArrayBuff to NDArrayPool, now in NDArray.cpp.
|
||||
<li>Renamed ADDriverBase to ADDriver
|
||||
<li>Removed ADUtils
|
||||
<li>The asynHandle interface in asyn was renamed to asynGenericPointer,
|
||||
many changes to incorporate this.
|
||||
<li>Removed separate readback parameters in drivers and template files
|
||||
<li>Changed from mbbi/mbbo records to bi/bo records where possible now
|
||||
that the asynInt32 interface supports bi/bo records.
|
||||
<li>Base class constructor no longer initializes all asyn interfaces,
|
||||
only the selected ones.
|
||||
<li>NDArray pool is no longer global, each server creates its own pool if needed.
|
||||
<li>Implemented real routines for writeInt32, writeFloat64, and writeOctet in asynPortDriver.cpp,
|
||||
removed them from ADDriver.cpp where they were not needed.
|
||||
</ul>
|
||||
|
||||
|
||||
<h2 align="center">Release 1-1 (10-May-2008)</h2>
|
||||
<ul>
|
||||
<li>Major rewrite. Converted device drivers and plugins from C to C++ with
|
||||
C++ base classes that handle many of the details of asyn and of
|
||||
callbacks and threading for plugins.
|
||||
<li>Everything except device drivers and top-level EPICS databases and
|
||||
channel access clients are now fully N-dimensional, not restricted to
|
||||
2-D.
|
||||
<li>NDPluginFile now uses netCDF format, which is a portable self-describing
|
||||
binary file format.
|
||||
<li>Added NDPluginROI which implements region-of-interest.
|
||||
</ul>
|
||||
|
||||
<h2 align="center">Release 1-0 (11-Apr-2008)</h2>
|
||||
<ul>
|
||||
<li>Initial release, still many things remaining to be done.
|
||||
</ul>
|
||||
|
||||
<address>
|
||||
Suggestions and Comments to: <br>
|
||||
<a href="mailto:rivers@cars.uchicago.edu">Mark Rivers </a>:
|
||||
(rivers@cars.uchicago.edu) <br>
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<head>
|
||||
<title>areaDetectorReleaseNotes.html</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1 style="text-align: center">areaDetector Release Notes</h1>
|
||||
<h2 style="text-align: center">Release 1-2 (xxx-June-2008)</h2>
|
||||
<ul>
|
||||
<li>Major update to documentation></li>
|
||||
<li>Significant enhancement to ROI plugin. Added net counts, ROI highlighting.</li>
|
||||
<li>Added driver for Pilatus detectors</li>
|
||||
<li>Added driver for ADSC detectors (done by Lewis Muir, IMCA-CAT)</li>
|
||||
<li>Renamed asynParamBase to asynPortDriver.</li>
|
||||
<li>Renamed NDArrayBase to NDArrayDriver</li>
|
||||
<li>Renamed NDPluginBase to NDPluginDriver</li>
|
||||
<li>Renamed NDArrayBuff to NDArrayPool, now in NDArray.cpp.</li>
|
||||
<li>Renamed ADDriverBase to ADDriver</li>
|
||||
<li>Removed ADUtils</li>
|
||||
<li>The asynHandle interface in asyn was renamed to asynGenericPointer,
|
||||
many changes to incorporate this.</li>
|
||||
<li>Removed separate readback parameters in drivers and template files</li>
|
||||
<li>Changed from mbbi/mbbo records to bi/bo records where possible now
|
||||
that the asynInt32 interface supports bi/bo records.</li>
|
||||
<li>Base class constructor no longer initializes all asyn interfaces,
|
||||
only the selected ones.</li>
|
||||
<li>NDArray pool is no longer global, each server creates its own pool if needed.</li>
|
||||
<li>Implemented real routines for writeInt32, writeFloat64, and writeOctet in asynPortDriver.cpp,
|
||||
removed them from ADDriver.cpp where they were not needed.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2 style="text-align: center">Release 1-1 (10-May-2008)</h2>
|
||||
<ul>
|
||||
<li>Major rewrite. Converted device drivers and plugins from C to C++ with
|
||||
C++ base classes that handle many of the details of asyn and of
|
||||
callbacks and threading for plugins.</li>
|
||||
<li>Everything except device drivers and top-level EPICS databases and
|
||||
channel access clients are now fully N-dimensional, not restricted to
|
||||
2-D.</li>
|
||||
<li>NDPluginFile now uses netCDF format, which is a portable self-describing
|
||||
binary file format.</li>
|
||||
<li>Added NDPluginROI which implements region-of-interest.</li>
|
||||
</ul>
|
||||
|
||||
<h2 style="text-align: center">Release 1-0 (11-Apr-2008)</h2>
|
||||
<ul>
|
||||
<li>Initial release, still many things remaining to be done.</li>
|
||||
</ul>
|
||||
|
||||
<address>
|
||||
Suggestions and Comments to: <br/>
|
||||
<a href="mailto:rivers@cars.uchicago.edu">Mark Rivers </a>:
|
||||
(rivers@cars.uchicago.edu) <br/>
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+1029
-1028
File diff suppressed because it is too large
Load Diff
+213
-199
@@ -1,199 +1,213 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>areaDetector Simulation driver</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<H1 style="text-align: center">areaDetector Simulation driver</H1>
|
||||
|
||||
<H2> September 5, 2008</H2>
|
||||
<H2> Mark Rivers</H2>
|
||||
<H2> University of Chicago</H2>
|
||||
|
||||
<P> </P>
|
||||
|
||||
<h2>Table of Contents</h2>
|
||||
<ul>
|
||||
<li><a href="#Introduction">Introduction</a></li>
|
||||
<li><a href="#Driver_parameters">Simulation driver specific parameters</a></li>
|
||||
<li><a href="#Unsupported">Unsupported standard driver parameters</q>
|
||||
Features</a></li>
|
||||
<li><a href="#Screenshots">Screenshots</a></li>
|
||||
<li><a href="#Configuring">Configuring</a></li>
|
||||
</ul>
|
||||
|
||||
<H2 id="Introduction">Introduction</H2>
|
||||
|
||||
simDetector is a driver for a simulated area detector. It inherits from ADDriver. The simulation detector implements
|
||||
nearly all of the parameters defined in ADStdDriverParams.h, with the exception of the file saving parameters,
|
||||
which it does not
|
||||
implement. It also implements a few parameters that are specific
|
||||
to the simulation detector. The simulation detector is useful as a model for writing real detector drivers. It is
|
||||
also very useful for testing plugins and channel access clients.
|
||||
This is part of the definition of the simDetector class:
|
||||
<PRE>
|
||||
class simDetector : public ADDriver {
|
||||
public:
|
||||
simDetector(const char *portName, int maxSizeX, int maxSizeY, NDDataType_t dataType,
|
||||
int maxBuffers, size_t maxMemory);
|
||||
|
||||
/* These are the methods that we override from ADDriver */
|
||||
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
|
||||
virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
|
||||
virtual asynStatus drvUserCreate(asynUser *pasynUser, const char *drvInfo,
|
||||
const char **pptypeName, size_t *psize);
|
||||
void report(FILE *fp, int details);
|
||||
</PRE>
|
||||
The portName, maxBuffers, and maxMemory arguments are passed to the ADDriver base class constructor. The maxSizeX, maxSizeY, and
|
||||
dataType arguments are specific to the simulation driver, controlling the maximum image size and initial data type of the
|
||||
computed images. The writeInt32 and writeFloat64 methods override those in the base class. The driver takes action
|
||||
when new parameters are passed via those interfaces. For example, the ADAcquire parameter (on the asynInt32 interface) is
|
||||
used to turn acquisition (i.e. computing new images) on and off.
|
||||
<P>
|
||||
The simulation driver initially sets the image[i, j] = i*gainX + j*gainY * gain * exposureTime * 1000. Thus the
|
||||
image is a linear ramp in the X and Y directions, with the gains in each direction being detector-specific parameters.
|
||||
Each subsquent acquisition increments each pixel value by gain*exposureTime*1000. Thus if gain=1 and exposureTime=.001
|
||||
second then the pixels are incremented by 1. If the array is an unsigned 8 or 16 bit integer then the pixels
|
||||
will overflow and wrap around to 0 after some period of time. This gives the appearance of bands that appear to move
|
||||
with time. The slope of the bands and their periodicity can be adjusted by changing the gains and exposure times.
|
||||
<P>
|
||||
The driver creates a thread that waits for a signal to start acquisition. When acquisition is started that thread
|
||||
computes new images and then calls back any registered plugins as follows:
|
||||
<PRE>
|
||||
/* Put the frame number and time stamp into the buffer */
|
||||
pImage->uniqueId = imageCounter;
|
||||
pImage->timeStamp = startTime.secPastEpoch + startTime.nsec / 1.e9;
|
||||
|
||||
/* Call the NDArray callback */
|
||||
/* Must release the lock here, or we can get into a deadlock, because we can
|
||||
* block on the plugin lock, and the plugin can be calling us */
|
||||
epicsMutexUnlock(this->mutexId);
|
||||
asynPrint(this->pasynUser, ASYN_TRACE_FLOW,
|
||||
"%s:%s: calling imageData callback\n", driverName, functionName);
|
||||
doCallbacksGenericPointer(pImage, NDArrayData, addr);
|
||||
epicsMutexLock(this->mutexId);
|
||||
</PRE>
|
||||
<H2 id="Driver_parameters">Simulation driver specific parameters</H2>
|
||||
The simulation driver-specific parameters are the following:
|
||||
<P>
|
||||
<TABLE style="TEXT-ALIGN: left" cellSpacing=2 cellPadding=2 border=1>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD COLSPAN=7, ALIGN=CENTER><B>Parameter Definitions in simDetector.cpp and EPICS Record Definitions in simDetector.template</B></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH>Enum name</TH>
|
||||
<TH>asyn interface</TH>
|
||||
<TH>Access</TH>
|
||||
<TH>Description</TH>
|
||||
<TH>drvUser string</TH>
|
||||
<TH>EPICS record name</TH>
|
||||
<TH>EPICS record type</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>SimGainX</TD>
|
||||
<TD>asynFloat64</TD>
|
||||
<TD>r/w</TD>
|
||||
<TD>Gain in the X direction</TD>
|
||||
<TD>SIM_GAINX</TD>
|
||||
<TD>$(P)$(R)GainX<BR>$(P)$(R)GainX_RBV</TD>
|
||||
<TD>ao<BR>ai</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>SimGainY</TD>
|
||||
<TD>asynFloat64</TD>
|
||||
<TD>r/w</TD>
|
||||
<TD>Gain in the Y direction</TD>
|
||||
<TD>SIM_GAINY</TD>
|
||||
<TD>$(P)$(R)GainY<BR>$(P)$(R)GainY_RBV</TD>
|
||||
<TD>ao<BR>ai</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>SimResetImage</TD>
|
||||
<TD>asynInt32</TD>
|
||||
<TD>r/w</TD>
|
||||
<TD>Reset image back to initial conditions when 1.</TD>
|
||||
<TD>RESET_IMAGE</TD>
|
||||
<TD>$(P)$(R)Reset<BR>$(P)$(R)Reset_RBV</TD>
|
||||
<TD>longout<BR>longin</TD>
|
||||
</TR>
|
||||
</TBODY>
|
||||
</TABLE>
|
||||
<P>
|
||||
<h2 id="Unsupported">Unsupported standard driver parameters</h2>
|
||||
|
||||
<ul>
|
||||
<li>Shutter control: No shutter control is supported</li>
|
||||
<li>Collect: Number of exposures per image (ADNumExposures)</li>
|
||||
<li>Collect: Trigger mode (ADTriggerMode)</li>
|
||||
<li>File control: No file I/O is supported</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<H2 id="Screenshots">Screenshots</H2>
|
||||
The following is the MEDM screen ADBase.adl connected to a simulation detector.
|
||||
<P>
|
||||
<IMG src="ADBase_sim.png">
|
||||
<P>
|
||||
The following is the MEDM screen that provides access to the specific parameters for the simulation detector.
|
||||
<P>
|
||||
<IMG src="simDetector.png">
|
||||
<P>
|
||||
<P>
|
||||
The following is an IDL epics_ad_display screen using image_display (discussed below) illustrating the simulation detector images.
|
||||
|
||||
<P>
|
||||
<IMG src="simDetector_image_display.png">
|
||||
|
||||
<h2 id="Configuring">Configuring</h2>
|
||||
|
||||
<p>
|
||||
This driver is configured via the <tt>simDetectorConfig()</tt> function. If this is
|
||||
to be used in an IOC, it must be called before <tt>iocInit()</tt>. It has the
|
||||
following syntax:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><tt>int simDetectorConfig(const char *portName, int maxSizeX, int maxSizeY, int dataType,
|
||||
int maxBuffers, size_t maxMemory)</tt></dt>
|
||||
<dd>
|
||||
<dl>
|
||||
<dt><tt>portName</tt></dt>
|
||||
<dd>ASYN port name for the driver instance</dd>
|
||||
<dt><tt>maxSizeX</tt></dt>
|
||||
<dd>Maximum number of pixels in the X direction for the simulated detector</dd>
|
||||
<dt><tt>maxSizeY</tt></dt>
|
||||
<dd>Maximum number of pixels in the Y direction for the simulated detector</dd>
|
||||
<dt><tt>dataType</tt></dt>
|
||||
<dd>Initial data type of the detector data. These are the enum values for NDDataType_t, i.e.
|
||||
<ul>
|
||||
<li>0=NDInt8
|
||||
<li>1=NDUInt8
|
||||
<li>2=NDInt16
|
||||
<li>3=NDUInt16
|
||||
<li>4=NDInt32
|
||||
<li>5=NDUInt32
|
||||
<li>6=NDFloat32
|
||||
<li>7=NDFloat64
|
||||
</ul></dd>
|
||||
<dt><tt>maxBuffers</tt></dt>
|
||||
<dd>Maxiumum number of NDArray objects (image buffers) this driver is allowed to allocate.
|
||||
The driver itself requires 2 buffers, and each queue element in a plugin can require one buffer.
|
||||
So, for example, if 3 plugins are connected
|
||||
to this driver, and each has a queue size of 10, then maxBuffers should be at least 32.</dd>
|
||||
<dt><tt>maxMemory</tt></dt>
|
||||
<dd>Maxiumum number of bytes of memory for all NDArray objects (image buffers) allocated by this driver.
|
||||
If maxSizeX=maxSizeY=1024, and maxBuffers=32, then maxMemory should be at least 33554432 (~33MB).</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
If being used in an IOC, and an EPICS PV interface with the driver is desired,
|
||||
the <tt>ADBase.template</tt> and <tt>simDetector.template</tt> databases should also
|
||||
be loaded for the driver instance.
|
||||
<P>
|
||||
The areaDetector software comes with an example IOC for the simulation driver, <tt>iocBoot/iocSimDetector</tt>.
|
||||
</p>
|
||||
</BODY>
|
||||
</HTML>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>areaDetector Simulation driver</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h1 style="text-align: center">areaDetector Simulation driver</h1>
|
||||
|
||||
<h2> September 5, 2008</h2>
|
||||
<h2> Mark Rivers</h2>
|
||||
<h2> University of Chicago</h2>
|
||||
</center>
|
||||
<p> </p>
|
||||
|
||||
<h2>Table of Contents</h2>
|
||||
<ul>
|
||||
<li><a href="#Introduction">Introduction</a></li>
|
||||
<li><a href="#Driver_parameters">Simulation driver specific parameters</a></li>
|
||||
<li><a href="#Unsupported">Unsupported standard driver parameters</a></li>
|
||||
<li><a href="#Screenshots">Screenshots</a></li>
|
||||
<li><a href="#Configuring">Configuring</a></li>
|
||||
</ul>
|
||||
|
||||
<h2 id="Introduction">Introduction</h2>
|
||||
|
||||
<p>
|
||||
simDetector is a driver for a simulated area detector. It inherits from ADDriver. The simulation detector implements
|
||||
nearly all of the parameters defined in ADStdDriverParams.h, with the exception of the file saving parameters,
|
||||
which it does not
|
||||
implement. It also implements a few parameters that are specific
|
||||
to the simulation detector. The simulation detector is useful as a model for writing real detector drivers. It is
|
||||
also very useful for testing plugins and channel access clients.
|
||||
This is part of the definition of the simDetector class:
|
||||
</p>
|
||||
<pre>
|
||||
class simDetector : public ADDriver {
|
||||
public:
|
||||
simDetector(const char *portName, int maxSizeX, int maxSizeY, NDDataType_t dataType,
|
||||
int maxBuffers, size_t maxMemory);
|
||||
|
||||
/* These are the methods that we override from ADDriver */
|
||||
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
|
||||
virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
|
||||
virtual asynStatus drvUserCreate(asynUser *pasynUser, const char *drvInfo,
|
||||
const char **pptypeName, size_t *psize);
|
||||
void report(FILE *fp, int details);
|
||||
</pre>
|
||||
<p>The portName, maxBuffers, and maxMemory arguments are passed to the ADDriver base class constructor. The maxSizeX, maxSizeY, and
|
||||
dataType arguments are specific to the simulation driver, controlling the maximum image size and initial data type of the
|
||||
computed images. The writeInt32 and writeFloat64 methods override those in the base class. The driver takes action
|
||||
when new parameters are passed via those interfaces. For example, the ADAcquire parameter (on the asynInt32 interface) is
|
||||
used to turn acquisition (i.e. computing new images) on and off.
|
||||
</p>
|
||||
<p>
|
||||
The simulation driver initially sets the image[i, j] = i*gainX + j*gainY * gain * exposureTime * 1000. Thus the
|
||||
image is a linear ramp in the X and Y directions, with the gains in each direction being detector-specific parameters.
|
||||
Each subsquent acquisition increments each pixel value by gain*exposureTime*1000. Thus if gain=1 and exposureTime=.001
|
||||
second then the pixels are incremented by 1. If the array is an unsigned 8 or 16 bit integer then the pixels
|
||||
will overflow and wrap around to 0 after some period of time. This gives the appearance of bands that appear to move
|
||||
with time. The slope of the bands and their periodicity can be adjusted by changing the gains and exposure times.
|
||||
</p>
|
||||
<p>
|
||||
The driver creates a thread that waits for a signal to start acquisition. When acquisition is started that thread
|
||||
computes new images and then calls back any registered plugins as follows:
|
||||
</p>
|
||||
<pre>
|
||||
/* Put the frame number and time stamp into the buffer */
|
||||
pImage->uniqueId = imageCounter;
|
||||
pImage->timeStamp = startTime.secPastEpoch + startTime.nsec / 1.e9;
|
||||
|
||||
/* Call the NDArray callback */
|
||||
/* Must release the lock here, or we can get into a deadlock, because we can
|
||||
* block on the plugin lock, and the plugin can be calling us */
|
||||
epicsMutexUnlock(this->mutexId);
|
||||
asynPrint(this->pasynUser, ASYN_TRACE_FLOW,
|
||||
"%s:%s: calling imageData callback\n", driverName, functionName);
|
||||
doCallbacksGenericPointer(pImage, NDArrayData, addr);
|
||||
epicsMutexLock(this->mutexId);
|
||||
</pre>
|
||||
<h2 id="Driver_parameters">Simulation driver specific parameters</h2>
|
||||
<p>
|
||||
The simulation driver-specific parameters are the following:
|
||||
</p>
|
||||
|
||||
<table style="text-align: left" "cellSpacing=2 cellPadding=2 border=1">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td "colspan=7, align=center"><b>Parameter Definitions in simDetector.cpp and EPICS Record Definitions in simDetector.template</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Enum name</th>
|
||||
<th>asyn interface</th>
|
||||
<th>Access</th>
|
||||
<th>Description</th>
|
||||
<th>drvUser string</th>
|
||||
<th>EPICS record name</th>
|
||||
<th>EPICS record type</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SimGainX</td>
|
||||
<td>asynFloat64</td>
|
||||
<td>r/w</td>
|
||||
<td>Gain in the X direction</td>
|
||||
<td>SIM_GAINX</td>
|
||||
<td>$(P)$(R)GainX<br/>$(P)$(R)GainX_RBV</td>
|
||||
<td>ao<br/>ai</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SimGainY</td>
|
||||
<td>asynFloat64</td>
|
||||
<td>r/w</td>
|
||||
<td>Gain in the Y direction</td>
|
||||
<td>SIM_GAINY</td>
|
||||
<td>$(P)$(R)GainY<br/>$(P)$(R)GainY_RBV</td>
|
||||
<td>ao<br/>ai</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SimResetImage</td>
|
||||
<td>asynInt32</td>
|
||||
<td>r/w</td>
|
||||
<td>Reset image back to initial conditions when 1.</td>
|
||||
<td>RESET_IMAGE</td>
|
||||
<td>$(P)$(R)Reset<br/>$(P)$(R)Reset_RBV</td>
|
||||
<td>longout<br/>longin</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
<h2 id="Unsupported">Unsupported standard driver parameters</h2>
|
||||
|
||||
<ul>
|
||||
<li>Shutter control: No shutter control is supported</li>
|
||||
<li>Collect: Number of exposures per image (ADNumExposures)</li>
|
||||
<li>Collect: Trigger mode (ADTriggerMode)</li>
|
||||
<li>File control: No file I/O is supported</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2 id="Screenshots">Screenshots</h2>
|
||||
<p>
|
||||
The following is the MEDM screen ADBase.adl connected to a simulation detector.
|
||||
</p>
|
||||
<p>
|
||||
<img src="ADBase_sim.png" alt="ADBase_sim.png"/>
|
||||
</p>
|
||||
<p>
|
||||
The following is the MEDM screen that provides access to the specific parameters for the simulation detector.
|
||||
</p>
|
||||
<p>
|
||||
<img src="simDetector.png" alt="simDetector.png"/>
|
||||
</p>
|
||||
<p>
|
||||
The following is an IDL epics_ad_display screen using image_display (discussed below) illustrating the simulation detector images.
|
||||
|
||||
</p>
|
||||
<p>
|
||||
<img src="simDetector_image_display.png" alt="simDetector_image_display.png"/>
|
||||
</p>
|
||||
<h2 id="Configuring">Configuring</h2>
|
||||
|
||||
<p>
|
||||
This driver is configured via the <tt>simDetectorConfig()</tt> function. If this is
|
||||
to be used in an IOC, it must be called before <tt>iocInit()</tt>. It has the
|
||||
following syntax:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><tt>int simDetectorConfig(const char *portName, int maxSizeX, int maxSizeY, int dataType,
|
||||
int maxBuffers, size_t maxMemory)</tt></dt>
|
||||
<dd>
|
||||
<dl>
|
||||
<dt><tt>portName</tt></dt>
|
||||
<dd>ASYN port name for the driver instance</dd>
|
||||
<dt><tt>maxSizeX</tt></dt>
|
||||
<dd>Maximum number of pixels in the X direction for the simulated detector</dd>
|
||||
<dt><tt>maxSizeY</tt></dt>
|
||||
<dd>Maximum number of pixels in the Y direction for the simulated detector</dd>
|
||||
<dt><tt>dataType</tt></dt>
|
||||
<dd>Initial data type of the detector data. These are the enum values for NDDataType_t, i.e.
|
||||
<ul>
|
||||
<li>0=NDInt8</li>
|
||||
<li>1=NDUInt8</li>
|
||||
<li>2=NDInt16</li>
|
||||
<li>3=NDUInt16</li>
|
||||
<li>4=NDInt32</li>
|
||||
<li>5=NDUInt32</li>
|
||||
<li>6=NDFloat32</li>
|
||||
<li>7=NDFloat64</li>
|
||||
</ul></dd>
|
||||
<dt><tt>maxBuffers</tt></dt>
|
||||
<dd>Maxiumum number of NDArray objects (image buffers) this driver is allowed to allocate.
|
||||
The driver itself requires 2 buffers, and each queue element in a plugin can require one buffer.
|
||||
So, for example, if 3 plugins are connected
|
||||
to this driver, and each has a queue size of 10, then maxBuffers should be at least 32.</dd>
|
||||
<dt><tt>maxMemory</tt></dt>
|
||||
<dd>Maxiumum number of bytes of memory for all NDArray objects (image buffers) allocated by this driver.
|
||||
If maxSizeX=maxSizeY=1024, and maxBuffers=32, then maxMemory should be at least 33554432 (~33MB).</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
If being used in an IOC, and an EPICS PV interface with the driver is desired,
|
||||
the <tt>ADBase.template</tt> and <tt>simDetector.template</tt> databases should also
|
||||
be loaded for the driver instance.
|
||||
</p>
|
||||
<p>
|
||||
The areaDetector software comes with an example IOC for the simulation driver, <tt>iocBoot/iocSimDetector</tt>.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user