Documentation additions
git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@8948 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
This commit is contained in:
@@ -656,7 +656,8 @@ EXCLUDE_SYMLINKS = NO
|
||||
# against the file with absolute path, so to exclude all test directories
|
||||
# for example use the pattern */test/*
|
||||
|
||||
EXCLUDE_PATTERNS = */CDocFile40.h */CExpSetup20.h */CROIRect0.h */CWinx32App20.h
|
||||
EXCLUDE_PATTERNS = */CDocFile40.h */CExpSetup20.h */CROIRect0.h */CWinx32App20.h \
|
||||
*/tiny*
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
From <a href="http://optoelectronics.perkinelmer.com/">Perkin Elmer</a></p>
|
||||
<ul>
|
||||
<li>Amorphous silicon flat panel detectors. This support was written by Brian Tieman
|
||||
from the APS and will be part of areaDetector soon.</li>
|
||||
and John Hammonds from the APS.</li>
|
||||
</ul>
|
||||
<p>
|
||||
Please email any comments and bug reports to <a href="mailto:rivers@cars.uchicago.edu">
|
||||
@@ -95,7 +95,7 @@
|
||||
You can download the software from the links in the table below. The software is
|
||||
available both in source code form, and in pre-built form so that it can be used
|
||||
without an EPICS build system. The pre-built form includes binaries for linux-x86,
|
||||
win32-x86, solaris-sparc and some vxWorks archtectures.</p>
|
||||
win32-x86, cygwin-x86, solaris-sparc, and some vxWorks archtectures.</p>
|
||||
<table border="1" summary="Where to find the software">
|
||||
<tbody>
|
||||
<tr align="center">
|
||||
@@ -114,6 +114,22 @@
|
||||
<th>
|
||||
Known Problems</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
1-5</td>
|
||||
<td>
|
||||
xxx-May-2009</td>
|
||||
<td>
|
||||
<a href="http://cars.uchicago.edu/software/pub/areaDetectorR1-5.tgz">areaDetectorR1-5.tgz</a></td>
|
||||
<td>
|
||||
<a href="http://cars.uchicago.edu/software/pub/areaDetectorPrebuilt_R1-5.tgz">areaDetectorPrebuilt_R1-5.tgz</a></td>
|
||||
<td>
|
||||
<a href="areaDetectorDoc.html">areaDetectorDoc</a></td>
|
||||
<td>
|
||||
<a href="areaDetectorReleaseNotes.html">Release notes</a></td>
|
||||
<td>
|
||||
See release notes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
1-4</td>
|
||||
@@ -210,6 +226,64 @@
|
||||
<th>
|
||||
Required for</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="7">
|
||||
1-5</td>
|
||||
<td>
|
||||
EPICS base</td>
|
||||
<td>
|
||||
3.14.10</td>
|
||||
<td>
|
||||
Base support</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
asyn</td>
|
||||
<td>
|
||||
4-11</td>
|
||||
<td>
|
||||
Socket and interface support</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
busy</td>
|
||||
<td>
|
||||
1-2</td>
|
||||
<td>
|
||||
busy record. This was formerly included in sscan, but now has its own support module.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
calc</td>
|
||||
<td>
|
||||
2-7</td>
|
||||
<td>
|
||||
scalcout record, needed by sscan database and useful for other databases</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
sscan</td>
|
||||
<td>
|
||||
2-6-3</td>
|
||||
<td>
|
||||
sscan record</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
mca</td>
|
||||
<td>
|
||||
6-11</td>
|
||||
<td>
|
||||
mca record for getting time sequence of ROI counts</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
autosave</td>
|
||||
<td>
|
||||
4-5</td>
|
||||
<td>
|
||||
Save/restore</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="7">
|
||||
1-4</td>
|
||||
@@ -497,9 +571,8 @@
|
||||
<p>
|
||||
This software was originally developed by Mark Rivers.</p>
|
||||
<ul>
|
||||
<li>ANL/APS : In use at CARS beamlines.</li>
|
||||
<li>NSLS: In use on X17B2 and other beamlines.</li>
|
||||
<li>Australian Synchrotron : In use at microspectroscopy beamline, ID5.</li>
|
||||
<li>In use at APS, NSLS, DLS, SLS, BESSY, NSRRC and others.</li>
|
||||
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -83,9 +83,10 @@
|
||||
<li>Provide a mechanism for device-independent real-time data analysis such as regions-of-interest
|
||||
and statistics.</li>
|
||||
<li>Provide detector drivers for commonly used detectors in synchrotron applications.
|
||||
These include Prosilica GigE video cameras, MAR-CCD x-ray detectors, MAR-345 online
|
||||
imaging plate detectors, the Pilatus pixel-array detector, and the Roper Scientific
|
||||
CCD cameras.</li>
|
||||
These include Prosilica GigE video cameras, IEEE 1394 (Firewire) cameras,
|
||||
MAR-CCD x-ray detectors, MAR-345 online
|
||||
imaging plate detectors, the Pilatus pixel-array detector, Roper Scientific
|
||||
CCD cameras, and the Perkin-Elmer amorphous silicon detector.</li>
|
||||
</ul>
|
||||
<p>
|
||||
</p>
|
||||
@@ -102,11 +103,12 @@
|
||||
hardware. It is usually provided by the detector vendor. It may consist of a library
|
||||
or DLL, of a socket protocol to a driver, a Microsoft COM interface, etc.</li>
|
||||
<li>Layer 2. This is the driver that is written for the areaDetector application to
|
||||
control a particular detector. It is normally written in C++ and inherits from the
|
||||
control a particular detector. It is written in C++ and inherits from the
|
||||
ADDriver class. It uses the standard asyn interfaces for control and status information.
|
||||
Each time it receives a new data array it passes it as an NDArray object to all
|
||||
Layer 3 clients that have registered for callbacks. This is the only code that needs
|
||||
to be written to implement a new detector. Existing drivers range from 650 to 1050
|
||||
Each time it receives a new data array it can pass it as an NDArray object to all
|
||||
Layer 3 clients that have registered for callbacks.
|
||||
This is the only code that needs
|
||||
to be written to implement a new detector. Existing drivers range from 800 to 1800
|
||||
lines of code.</li>
|
||||
<li>Layer 3. Code running at this level is called a "plug-in". This code registers
|
||||
with a driver for a callback whenever there is a new data array. The existing plugins
|
||||
@@ -114,7 +116,7 @@
|
||||
color mode conversion (NDPluginColorConvert), and conversion of detector data to
|
||||
standard EPICS array types for use by Channel Access clients (NDPluginStdArrays).
|
||||
Plugins are normally written in C++ and inherit from NDPluginDriver. Existing plugins
|
||||
range from 300 to 700 lines of code.</li>
|
||||
range from 300 to 800 lines of code.</li>
|
||||
<li>Layer 4. This is standard asyn device support that comes with the EPICS asyn module.</li>
|
||||
<li>Layer 5. These are standard EPICS records, and EPICS database (template) files
|
||||
that define records to communicate with drivers at Layer 2 and plugins at Layer
|
||||
@@ -122,7 +124,7 @@
|
||||
<li>Layer 6. These are EPICS channel access clients, such as MEDM that communicate
|
||||
with the records at Layer 5. There is a free IDL client that can display images
|
||||
using EPICS waveform and other records communicating with the NDPluginStdArrays
|
||||
plugin at Layer 3.</li>
|
||||
plugin at Layer 3. Other clients are being developed, including an ImageJ plugin.</li>
|
||||
</ul>
|
||||
<p>
|
||||
The code in Layers 1-3 is essentially independent of EPICS. There are only 2 EPICS
|
||||
@@ -153,7 +155,7 @@
|
||||
to displaying this subregion. Similarly, the NDPluginFile plugin can be switched
|
||||
at run-time from saving the entire image to saving a selected ROI, just by changing
|
||||
its input source. Plugins can be used to form an image processing pipeline, for
|
||||
example with a detector providing data to a color convert plugin, which feed an
|
||||
example with a detector providing data to a color convert plugin, which feeds an
|
||||
ROI plugin, which feeds a file saving plugin. Each plugin can run in its own thread,
|
||||
and hence in its own core on a modern multi-core CPU.
|
||||
</p>
|
||||
@@ -166,10 +168,7 @@
|
||||
</p>
|
||||
<p>
|
||||
What follows is a detailed description of the software, working from the bottom
|
||||
up. Most of the code is object oriented, and written in C++. The parts of the code
|
||||
that depend on anything from EPICS except libCom and asyn have been kept in in separate
|
||||
C files, so that it should be easy to build applications that do not run as part
|
||||
of an EPICS IOC.
|
||||
up. Most of the code is object oriented, and written in C++.
|
||||
</p>
|
||||
<h2 id="Implementation_details">
|
||||
Implementation details</h2>
|
||||
@@ -187,347 +186,60 @@
|
||||
Detector drivers and plugins are asyn port drivers, meaning that they implement
|
||||
one or more of the standard asyn interfaces. They register themselves as interrupt
|
||||
sources, so that they do callbacks to registered asyn clients when values change.
|
||||
They inherit from the <a href="http://www.aps.anl.gov/epics/modules/soft/asyn">asynPortDriver
|
||||
base C++ class</a> that is provided in the asyn module. That base class handles
|
||||
They inherit from the <a href="asynPortDriver.html">asynPortDriver
|
||||
base C++ class</a> that is provided in the asyn module. (The previous link is temporary
|
||||
until asyn R4-11 is release). That base class handles
|
||||
all of the details of registering the port driver, registering the supported interfaces,
|
||||
and registering the required interrupt sources.
|
||||
and registering the required interrupt sources. There is also
|
||||
<a href="asynDoxygenHTML/index.html">detailed source documentation</a> for asynPortDriver.
|
||||
</p>
|
||||
<h3 id="NDArray">
|
||||
NDArray</h3>
|
||||
<p>
|
||||
The NDArray (N-Dimensional array) is the class that is used for passing detector
|
||||
data from drivers to plugins. The NDArray class is defined as follows:
|
||||
</p>
|
||||
<pre>#define ND_ARRAY_MAX_DIMS 10
|
||||
#define ND_SUCCESS 0
|
||||
#define ND_ERROR -1
|
||||
|
||||
/* Enumeration of array data types */
|
||||
typedef enum
|
||||
{
|
||||
NDInt8,
|
||||
NDUInt8,
|
||||
NDInt16,
|
||||
NDUInt16,
|
||||
NDInt32,
|
||||
NDUInt32,
|
||||
NDFloat32,
|
||||
NDFloat64
|
||||
} NDDataType_t;
|
||||
|
||||
/* Enumeration of color modes */
|
||||
typedef enum
|
||||
{
|
||||
NDColorModeMono,
|
||||
NDColorModeBayer,
|
||||
NDColorModeRGB1,
|
||||
NDColorModeRGB2,
|
||||
NDColorModeRGB3,
|
||||
NDColorModeYUV444,
|
||||
NDColorModeYUV422,
|
||||
NDColorModeYUV421
|
||||
} NDColorMode_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NDBayerRGGB = 0, /* First line RGRG, second line GBGB... */
|
||||
NDBayerGBRG = 1, /* First line GBGB, second line RGRG... */
|
||||
NDBayerGRBG = 2, /* First line GRGR, second line BGBG... */
|
||||
NDBayerBGGR = 3 /* First line BGBG, second line GRGR... */
|
||||
} NDBayerPattern_t;
|
||||
|
||||
typedef struct NDDimension {
|
||||
int size;
|
||||
int offset;
|
||||
int binning;
|
||||
int reverse;
|
||||
} NDDimension_t;
|
||||
|
||||
typedef struct NDArrayInfo {
|
||||
int nElements;
|
||||
int bytesPerElement;
|
||||
int totalBytes;
|
||||
} NDArrayInfo_t;
|
||||
|
||||
class NDArray {
|
||||
public:
|
||||
/* Data: NOTE this must come first because ELLNODE must be first, i.e. same address as object */
|
||||
/* The first 2 fields are used for the freelist */
|
||||
ELLNODE node;
|
||||
int referenceCount;
|
||||
/* The NDArrayPool object that created this array */
|
||||
void *owner;
|
||||
|
||||
int uniqueId;
|
||||
double timeStamp;
|
||||
int ndims;
|
||||
NDDimension_t dims[ND_ARRAY_MAX_DIMS];
|
||||
NDDataType_t dataType;
|
||||
NDColorMode_t colorMode;
|
||||
NDBayerPattern_t bayerPattern;
|
||||
int dataSize;
|
||||
void *pData;
|
||||
|
||||
/* Methods */
|
||||
NDArray();
|
||||
int initDimension (NDDimension_t *pDimension, int size);
|
||||
int getInfo (NDArrayInfo_t *pInfo);
|
||||
int reserve();
|
||||
int release();
|
||||
};
|
||||
</pre>
|
||||
<p>
|
||||
data from drivers to plugins.
|
||||
An NDArray is a general purpose class for handling array data. An NDArray object
|
||||
is self-describing, meaning it contains enough information to describe the data
|
||||
itself. It is not intended to contain meta-data describing how the data was collected,
|
||||
etc.
|
||||
itself. It can optionally contain "attributes" (class NDAttribute) which
|
||||
contain meta-data describing how the data was collected, etc.
|
||||
</p>
|
||||
<p>
|
||||
An NDArray can have up to ND_ARRAY_MAX_DIMS dimensions, currently 10. A fixed maximum
|
||||
number of dimensions is used to significantly simplify the code compared to unlimited
|
||||
number of dimensions. Each dimension of the array is described by an NDDimension_t
|
||||
structure. The fields in NDDimension_t are as follows:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>size</code> is the number of elements in this dimension.</li>
|
||||
<li><code>offset</code> is the starting element in this dimension relative to the
|
||||
first element of the detector in unbinned units. If a selected region of the detector
|
||||
is being read, then this value may be >0. The offset value is cumulative, so
|
||||
if a plugin such as NDPluginROI further selects a subregion, the offset is relative
|
||||
to the first element in the detector, and not to the first element of the region
|
||||
passed to NDPluginROI.</li>
|
||||
<li><code>binning</code> is the binning (sumation of elements) in this dimension.
|
||||
The offset value is cumulative, so if a plugin such as NDPluginROI performs binning,
|
||||
the binning is expressed relative to the pixels in the detector and not to the possibly
|
||||
binned pixels passed to NDPluginROI.</li>
|
||||
<li><code>reverse</code> is 0 if the data are in their normal order as read out from
|
||||
the detector in this dimension, and 1 if they are in reverse order. This value is
|
||||
cumulative, so if a plugin such as NDPluginROI reverses the data, the value must
|
||||
reflect the orientation relative to the original detector, and not to the possibly
|
||||
reversed data passed to NDPluginROI.</li>
|
||||
</ul>
|
||||
number of dimensions. Each dimension of the array is described by an
|
||||
<a href="areaDetectorDoxygenHTML/struct_n_d_dimension.html">NDDimension structure<a>.
|
||||
The <a href="areaDetectorDoxygenHTML/class_n_d_array.html">
|
||||
NDArray class documentation </a> describes this class in detail.
|
||||
<p>
|
||||
The first 3 data fields in the NDArray class, <code>(node, referenceCount, owner)</code>
|
||||
are used by the NDArrayPool class discussed below. The remaining data fields are
|
||||
as follows:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>uniqueId</code> This should be a number that uniquely identifies this array,
|
||||
e.g. frame number. Detector drivers should assign this number to the NDArray before
|
||||
calling the plugins.</li>
|
||||
<li><code>timeStamp</code> This should be a timestamp value in seconds recording when
|
||||
the frame was collected. The time=0 reference is driver-dependent because of differences
|
||||
in vendor libraries. If there is a choice, it is recommended to use timeStamp=0
|
||||
for Epoch, (00:00:00 UTC, January 1, 1970).</li>
|
||||
<li><code>ndims</code> The number of dimensions in this array.</li>
|
||||
<li><code>dims</code> Array of NDDimension_t structures. The array is of length ND_MAX_DIMS,
|
||||
but only the first <code>ndims</code> values must contain valid information.</li>
|
||||
<li><code>dataType</code> The data type of this array, one of the NDDataType_t enum
|
||||
values. The data types supported are signed and unsigned 8, 16, and 32-bit integers,
|
||||
and 32 and 64-bit floats. </li>
|
||||
<li><code>colorMode</code> The color mode this array, one of the NDColorMode_t enum
|
||||
values. The following are the supported color modes:
|
||||
<ul>
|
||||
<li><code>NDColorModeMono</code>: Monochromatic data, i.e. a single value at each
|
||||
pixel.</li>
|
||||
<li><code>NDColorModeBayer</code>: Bayer color. There is a single value at each pixel,
|
||||
but the pixels have a color filter array in front of them. The supported Bayer filter
|
||||
is the most common one, a repeating 2x2 array of
|
||||
<pre> Blue Green
|
||||
Green Red
|
||||
</pre>
|
||||
Transmitting data from the camera using the Bayer format consumes 3 times less bandwidth
|
||||
than transmitting one of the RGB formats. However, it requires more computation
|
||||
on the host to convert the data to an RGB format that most clients can display.</li>
|
||||
<li><code>NDColorModeRGB1</code>: Red, green, blue data with pixel interlace, i.e.
|
||||
the data array is [3, NX, NY], with the color being the fastest varying array index.</li>
|
||||
<li><code>NDColorModeRGB2</code>: Red, green, blue data with row interlace, i.e. the
|
||||
data array is [NX, 3, NY], with the color being the second fastest varying array
|
||||
index.</li>
|
||||
<li><code>NDColorModeRGB3</code>: Red, green, blue data with planar interlace, i.e.
|
||||
the data array is [NX, NY, 3], with the color being the slowest varying array index.</li>
|
||||
<li><code>NDColorModeYUV444</code>: YUV data with 96 bits for 4 pixels, or 24 bits
|
||||
per pixel. This is the same number of bits as 8-bit RGB.</li>
|
||||
<li><code>NDColorModeYUV422</code>: YUV data with 64 bits for 4 pixels, or 16 bits
|
||||
per pixel. This is 2/3 of the number of bits required for 8-bit RGB.</li>
|
||||
<li><code>NDColorModeYUV421</code>: YUV data with 48 bits for 4 pixels, or 12 bits
|
||||
per pixel. This is 1/2 of the number of bits required for 8-bit RGB.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code>bayerPattern</code> The Bayer pattern for this array, one of the NDBayerPattern_t
|
||||
enum values. This value is only meaningful if colorMode is NDColorModeBayer. The
|
||||
Bayer pattern values are explained in the comments above. This value is needed because
|
||||
the Bayer pattern will change when reading out a subset of the chip, for example
|
||||
if the X or Y offset values are not even numbers.</li>
|
||||
<li><code>dataSize</code> The size of the memory buffer pointed to by <code>pData</code>
|
||||
in bytes. This may be larger than the amount actually required to hold the data
|
||||
for this array.</li>
|
||||
<li><code>pData</code> Pointer to the memory for this array. The data is assumed to
|
||||
be stored in the order of <code>dims[0]</code> changing fastest, and <code>dims[ndims-1]</code>
|
||||
changing slowest.</li>
|
||||
</ul>
|
||||
<p>
|
||||
The methods of the NDArray class are:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>initDimension</code> This method simply initializes the dimension structure
|
||||
to size=size, binning=1, reverse=0, offset=0.</li>
|
||||
<li><code>getInfo</code>. This convenience method returns information about an NDArray,
|
||||
including the total number of elements, the number of byte per element, and the
|
||||
total number of bytes in the array.</li>
|
||||
<li><code>reserve</code>. This method calls NDArrayPool->reserve() for this object.
|
||||
It increases the reference count for this array.</li>
|
||||
<li><code>release</code>. This method calls NDArrayPool->release() for this object.
|
||||
It decreases the reference count for this array.</li>
|
||||
</ul>
|
||||
<h3 id="NDArrayPool">
|
||||
NDArrayPool</h3>
|
||||
<p>
|
||||
The NDArrayPool class manages a free list (pool) of NDArray objects (described above).
|
||||
The NDArrayPool class manages a free list (pool) of NDArray objects.
|
||||
Drivers allocate NDArray objects from the pool, and pass these objects to plugins.
|
||||
Plugins increase the reference count on the object when they place the object on
|
||||
their queue, and decrease the reference count when they are done processing the
|
||||
array. When the reference count reaches 0 again the NDArray object is placed back
|
||||
on the free list. This mechanism minimizes the copying of array data in plugins.
|
||||
The public interface of the NDArrayPool class is defined as follows:
|
||||
</p>
|
||||
<pre>class NDArrayPool {
|
||||
public:
|
||||
NDArrayPool (int maxBuffers, size_t maxMemory);
|
||||
NDArray* alloc (int ndims, int *dims, NDDataType_t dataType, int dataSize, void *pData);
|
||||
NDArray* copy (NDArray *pIn, NDArray *pOut, int copyData);
|
||||
int reserve (NDArray *pArray);
|
||||
int release (NDArray *pArray);
|
||||
int convert (NDArray *pIn,
|
||||
NDArray **ppOut,
|
||||
NDDataType_t dataTypeOut,
|
||||
NDDimension_t *outDims);
|
||||
int report (int details);
|
||||
</pre>
|
||||
<p>
|
||||
The methods of the NDArrayPool class are:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>NDArrayPool</code> This is the constructor for the class. The maxBuffers
|
||||
argument is the maximum number of NDArray objects that the pool is allowed to contain.
|
||||
If this value is negative then there is no limit on the number of NDArray objects.
|
||||
The maxMemory argument is the maxiumum number of bytes of memory the the pool is
|
||||
allowed to use, summed over all of the NDArray objects. If this value is negative
|
||||
then there is no limit on the amount of memory in the pool.</li>
|
||||
<li><code>alloc</code> This method allocates a new NDArray object. The first 3 arguments
|
||||
are required. ndims is the number of dimensions in the NDArray. dims is an array
|
||||
of dimensions, whose size must be at least ndims. dataType is the data type of the
|
||||
NDArray data. dataSize is the number of bytes to allocate for the array data. If
|
||||
it is 0 then alloc() will compute the size required from ndims, dims, and dataType.
|
||||
pData is a pointer to a data buffer. If it is NULL then alloc will allocate a new
|
||||
array buffer. If pData is not NULL then it is assumed to point to a valid buffer.
|
||||
In this case dataSize must contain the actual number of bytes in the existing array,
|
||||
and this array must be large enough to hold the array data. alloc() searches its
|
||||
free list to find a free NDArray buffer. If is cannot find one then it will allocate
|
||||
a new one and add it to the free list. If doing so would exceed maxBuffers then
|
||||
alloc() will return an error. Similarly if allocating the memory required for this
|
||||
NDArray would cause the cumulative memory allocated for the pool to exceed maxMemory
|
||||
then an error will be returned. alloc() sets the reference count for the returned
|
||||
NDArray to 1.</li>
|
||||
<li><code>copy</code>. This method makes a copy of an NDArray object. If the output
|
||||
array pointer is NULL then it is first allocated. If the output array object already
|
||||
exists (pOut!=NULL) then it must have sufficient memory allocated to it to hold
|
||||
the data. If the copyData flag is 1 then the array data is copied. If the copyData
|
||||
flag is 0 then all array fields except the data itself are copied, and the data
|
||||
will be initialized to 0.</li>
|
||||
<li><code>reserve</code>. This method increases the reference count for the NDArray
|
||||
object. Plugins must call reserve() when an NDArray is placed on a queue for later
|
||||
processing.</li>
|
||||
<li><code>release</code>. This method decreases the reference count for the NDArray
|
||||
object. Plugins must call release() when an NDArray is removed from the queue and
|
||||
processing on it is complete. Drivers must call release() after calling all plugins.</li>
|
||||
<li><code>convert</code> This method creates a new output NDArray from an input NDArray,
|
||||
performing conversion operations. The conversion can change the data type if dataTypeOut
|
||||
is different from pIn->dataType. It can also change the dimensions. outDims may
|
||||
have different values of size, binning, offset and reverse for each of its dimensions
|
||||
from input array dimensions (pIn->dims).</li>
|
||||
<li><code>report</code> This method reports on the free list size and other properties
|
||||
of the NDArrayPool object.</li>
|
||||
</ul>
|
||||
The <a href="areaDetectorDoxygenHTML/class_n_d_array_pool.html">
|
||||
NDArrayPool class documentation </a> describes this class in detail.
|
||||
|
||||
<h3 id="asynNDArrayDriver">
|
||||
asynNDArrayDriver</h3>
|
||||
<p>
|
||||
asynNDArrayDriver inherits from asynPortDriver. It implements the asynGenericPointer
|
||||
functions, assuming that these reference NDArray objects. This is the class from
|
||||
which both plugins and area detector drivers are indirectly derived. Its public
|
||||
interface is defined as follows:
|
||||
functions, for NDArray objects. This is the class from
|
||||
which both plugins and area detector drivers are indirectly derived.
|
||||
The <a href="areaDetectorDoxygenHTML/class_asyn_n_d_array_driver.html">
|
||||
asynNDArrayDriver class documentation </a> describes this class in detail.
|
||||
</p>
|
||||
<pre>class asynNDArrayDriver : public asynPortDriver {
|
||||
public:
|
||||
asynNDArrayDriver(const char *portName, int maxAddr, int paramTableSize, int maxBuffers, size_t maxMemory,
|
||||
int interfaceMask, int interruptMask);
|
||||
virtual asynStatus readGenericPointer(asynUser *pasynUser, void *genericPointer);
|
||||
virtual asynStatus writeGenericPointer(asynUser *pasynUser, void *genericPointer);
|
||||
virtual void report(FILE *fp, int details);
|
||||
|
||||
};
|
||||
</pre>
|
||||
<p>
|
||||
The methods of the asynNDArrayDriver class are:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>asynNDArrayDriver</code> This is the constructor for the class. portName,
|
||||
maxAddr, paramTableSize, interfaceMask and interruptMask are simply passed to the
|
||||
asynPortDriver base class constructor. asynNDArray creates an NDArrayPool object
|
||||
to allocate NDArray objects. maxBuffers and maxMemory are passed to the constructor
|
||||
for the NDArrayPool object.</li>
|
||||
<li><code>readGenericPointer</code> This method copies an NDArray object from the
|
||||
asynNDArrayDriver to an NDArray whose address is passed by the caller in the genericPointer
|
||||
argument. The caller must allocate the memory for the array, and pass the size in
|
||||
NDArray->dataSize. The method will limit the amount of data copied to the actual
|
||||
array size or the input dataSize, whichever is smaller.</li>
|
||||
<li><code>writeGenericPointer</code> This method currently does nothing. Derived classes
|
||||
must implement this method as required.</li>
|
||||
<li><code>report</code> This method calls the report function in the asynPortDriver
|
||||
base class. It then calls the NDArrayPool->report() method if details >5.</li>
|
||||
</ul>
|
||||
<h3 id="ADDriver">
|
||||
ADDriver</h3>
|
||||
<p>
|
||||
ADDriver inherits from asynNDArrayDriver. This is the class from which area detector
|
||||
drivers are directly derived. Its public interface is defined as follows:
|
||||
</p>
|
||||
<pre>class ADDriver : public asynNDArrayDriver {
|
||||
public:
|
||||
ADDriver(const char *portName, int maxAddr, int paramTableSize, int maxBuffers, size_t maxMemory,
|
||||
int interfaceMask, int interruptMask);
|
||||
|
||||
/* These are the methods that we override from asynPortDriver */
|
||||
virtual asynStatus drvUserCreate(asynUser *pasynUser, const char *drvInfo,
|
||||
const char **pptypeName, size_t *psize);
|
||||
|
||||
/* These are the methods that are new to this class */
|
||||
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
|
||||
int createFileName(int maxChars, char *fullFileName);
|
||||
void setShutter(int open)
|
||||
</pre>
|
||||
<p>
|
||||
The methods of the ADDriver class are:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>ADDriver</code> This is the constructor for the class. All of the arguments
|
||||
are simply passed to the constructor for the asynNDArrayDriver base class. After
|
||||
calling the base class constructor this method sets reasonable default values for
|
||||
all of the parameters defined in ADStdDriverParams.h.</li>
|
||||
<li><code>drvUserCreate</code> This method returns one of the enum values for the
|
||||
parameters defined in ADStdDriverParams.h if the driverInfo field matches one the
|
||||
strings defined in that file. Derived classes will typically provide an implementation
|
||||
of drvUserCreate() that searches for parameters that are unique to that detector
|
||||
driver. If a parameter is not matched, then ADDriver->drvUserCreate() will be called
|
||||
to see if it is a standard driver parameter (defined in ADStdDriverParams.h).</li>
|
||||
<li><code>createFileName</code> This is a convenience function that constructs a complete
|
||||
file name in the ADFullFileName parameter from the ADFilePath, ADFileName, ADFileNumber,
|
||||
and ADFileTemplate parameters.</li>
|
||||
<li><code>setShutter</code> This method will open (1) or close (0) the shutter if
|
||||
ADShutterMode==ADShutterModeEPICS. Drivers will implement setShutter if they support
|
||||
ADShutterModeDetector. If ADShutterMode=ADShutterModeDetector they will control
|
||||
the shutter directly, else they will call this method.</li>
|
||||
</ul>
|
||||
drivers are directly derived.
|
||||
The <a href="areaDetectorDoxygenHTML/class_a_d_driver.html">
|
||||
ADDriver class documentation </a> describes this class in detail.
|
||||
|
||||
<h3 id="ADStdDriverParams">
|
||||
ADStdDriverParams</h3>
|
||||
<p>
|
||||
|
||||
@@ -9,31 +9,118 @@
|
||||
<h1 style="text-align: center">
|
||||
areaDetector Release Notes</h1>
|
||||
<h2 style="text-align: center">
|
||||
Release 1-5 (xxx-April-2009)</h2>
|
||||
Release 1-5 (xxx-May-2009)</h2>
|
||||
<ul>
|
||||
<li>Added a driver for mar345 online image plate detector. This driver communicates
|
||||
via a TCP/IP socket with the mar345dtb program, which must be used to control the
|
||||
detector.</li>
|
||||
<li>Added a driver for Firewire IIDC/DCAM cameras under Windows. This driver uses
|
||||
the Windows 1394 camera driver from Carnegie Mellon University.</li>
|
||||
<li>Added support for color to the simulation detector driver. It now supports color
|
||||
modes Mono, RGB1, RGB2 and RGB3.</li>
|
||||
<li>Fixed 2 serious bugs in the Roper driver. It was not selecting ROI mode correctly.
|
||||
When NumAcquisitions was > 1 it was only collecting the first frame correctly,
|
||||
subsequent frames were the same as a first one. This has been isolated to a bug
|
||||
in the WinView COM interface, and a workaround for the problem has been implemented.</li>
|
||||
<li>Began to document the source code with comments that doxygen can processes. Thanks
|
||||
to John Hammonds from APS for doing this.</li>
|
||||
<li>Moved the asynPortDriver base C++ class from the areaDetector module to the asyn
|
||||
module. The asynPortDriver base class was modified slightly to make it more general.
|
||||
In particular the constructor no longer hardcodes ASYN_CANBLOCK, ASYN_MULTIDEVICE,
|
||||
epicsThreadPriorityMedium, and epicsThreadStackMedium. This requires that asyn R4-11
|
||||
or later be used, and requires 2 additional arguments to the constructor (priority
|
||||
and stackSize) for all areaDetector drivers and plugins.</li>
|
||||
<li>Fixed bug in NDPluginFile: was not closing file properly when stream mode was
|
||||
stopped before the requested number of frames.</li>
|
||||
<li>Fixed Makefiles to instantiate templates on vxWorks.</li>
|
||||
<li>Minor bug fixes for Prosilica driver (function names in debug statements).</li>
|
||||
<li>General
|
||||
<ul>
|
||||
<li>Added "attributes" to NDArray. Attributes are used to contain metadata about
|
||||
the array. Each attribute has a name, description, datatype and value. Attributes
|
||||
can be added by drivers or plugins, and travel with the array through the plugin chain,
|
||||
and can ultimately be written with the array data to a file. Attributes can come
|
||||
from driver or plugin parameters, or from EPICS PVs anywhere on the network.</li>
|
||||
<li>Separated parameters and functions which are general to NDArray data
|
||||
(asynNDArrayDriver base class) from those which are specific to areaDetector data (ADDriver
|
||||
base class). This makes it easy and clean to use asynNDArray driver for future applications
|
||||
beyond areaDetector, such as drivers for the XIA xMAP digital spectroscopy system.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Drivers
|
||||
<ul>
|
||||
<li>New driver for mar345 online image plate detector. This driver communicates
|
||||
via a TCP/IP socket with the mar345dtb program, which must be used to control the
|
||||
detector.</li>
|
||||
<li>New driver for Firewire IIDC/DCAM cameras under Windows. This driver uses
|
||||
the Windows 1394 camera driver from Carnegie Mellon University.</li>
|
||||
<li>New driver for the Perkin-Elmer amorphous silicon flat panel detectors. Thanks to
|
||||
Brian Tieman and John Hammonds for this driver.</li>
|
||||
<li>Added support for color to the simulation detector driver. It now supports color
|
||||
modes Mono, RGB1, RGB2 and RGB3.</li>
|
||||
<li>Fixed 2 serious bugs in the Roper driver. It was not selecting ROI mode correctly.
|
||||
When NumAcquisitions was > 1 it was only collecting the first frame correctly,
|
||||
subsequent frames were the same as a first one. This has been isolated to a bug
|
||||
in the WinView COM interface, and a workaround for the problem has been implemented.</li>
|
||||
<li>Solved problem of Prosilica driver crashing on Linux. The problem was with the
|
||||
SIGALARM signal handlers in EPICS base (R3.14.10 and earlier). There is a patch for
|
||||
base to fix this problem, and this fix will be included in EPICS base 3.14.11.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Plugins
|
||||
<ul>
|
||||
<li>Changed NDPluginFile from directly supporting netCDF to be a base class from which
|
||||
actual file plugins derive.</li>
|
||||
<li>Changed netCDF file support to be derived class inheriting from NDPluginFile.
|
||||
Added support for writing NDArray attributes to the netCDF file.</li>
|
||||
<li>New file plugin for TIFF files. The TIFF support includes 8, 16 and 32-bit integers.
|
||||
It supports monochrome and color images, including all 3 color interleave modes (RGB1, RGB2
|
||||
and RGB3. areaDetector contains all required support files to build and run the TIFF
|
||||
file plugin on win32-x86 and cygwin-x86. To build on Linux it is necessary to install
|
||||
the libtiff and libtiffstatic packages.
|
||||
Thanks to John Hammonds for the initial work on this plugin.</li>
|
||||
<li>New file plugin for JPEG files. The JPEG support is limited to 8-bit integers, but
|
||||
it supports monochrome and color images, including all 3 color interleave modes (RGB1, RGB2
|
||||
and RGB3. Control is provided for the JPEG quality (compression) on a scaler of 0 (worst)
|
||||
to 100 (best). areaDetector contains all required support files to build and run the JPEG
|
||||
file plugin on win32-x86 and cygwin-x86. To build on Linux it is necessary to install
|
||||
the libjpeg and libjpegstatic packages. </li>
|
||||
<li>Fixed bug in NDPluginFile: was not closing file properly when stream mode was
|
||||
stopped before the requested number of frames.</li>
|
||||
<li>Fixed logic problem with FileNumber record in NDFile.template database. The previous
|
||||
logic that kept the ao record in sync with the ai record was causing the ao record to
|
||||
process when it should not have been, causing an extra call to the driver.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Viewers
|
||||
<ul>
|
||||
<li>Improved IDL epics_ad_display viewer. The last image is now stored in the program, and
|
||||
it is now redisplayed if the view mode is changed (TVSCL to iimage, etc.) or if the display
|
||||
parameters are changed (autoscale, flip Y, minimum, maximum, etc.).</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Documentation
|
||||
<ul>
|
||||
<li>Documented the source code with comments that doxygen can processes to produce HTML
|
||||
documentation directly from the source. This provides documentation for each class, as
|
||||
well as the class inheritence tree.
|
||||
Thanks to John Hammonds for starting this.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Internals
|
||||
<ul>
|
||||
<li>Moved the asynPortDriver base C++ class from the areaDetector module to the asyn
|
||||
module. The asynPortDriver base class was modified slightly to make it more general.
|
||||
In particular the constructor no longer hardcodes ASYN_CANBLOCK, ASYN_MULTIDEVICE,
|
||||
epicsThreadPriorityMedium, and epicsThreadStackMedium. This requires that asyn R4-11
|
||||
or later be used, and requires 2 additional arguments to the constructor (priority
|
||||
and stackSize) for all areaDetector drivers and plugins.</li>
|
||||
<li>Removed mutexId from asynPortDriver base class, and added lock() and unlock()
|
||||
methods. This hides the implementation of the locking, since we might want to
|
||||
implement these with asynManager->lockPort in the future.</li>
|
||||
<li>Removed the file ADStdParams.h. Moved the definition of parameters that are
|
||||
general to NDArray drivers into asynNDArrayDriver.h, and those that are specific
|
||||
to areaDetector drivers into ADDriver.h.</li>
|
||||
<li>Added an XML parser which is used for attribute definition files.</li>
|
||||
<li>Fixed Makefiles to instantiate templates on vxWorks.</li>
|
||||
<li>Moved createFileName() from ADDriver and NDPluginDriver to their base class,
|
||||
asynNDArrayDriver.</li>
|
||||
<li>Changed colorMode and bayerPattern from being properties of NDArray to being attributes,
|
||||
since they are not general to NDArray but are specific to areaDetector.</li>
|
||||
<li>Added new method asynPortDriver::drvUserCreateParam, which simplifies drvUserCreate code in all
|
||||
drivers and plugins.</li>
|
||||
<li>Reduced number of files for all plugins and drivers. Previously there was an XXX.cpp, drvXXX.h,
|
||||
and drvXXXEpics.c. The .h and .c files were used to keep the drivers and plugins independent of
|
||||
EPICS IOC code. It was decided that that extra 2 files per driver and plugin were not
|
||||
worth the added complexity. If it is desired to run drivers and plugins outside of an IOC
|
||||
it could be done with conditional compilation of the IOC dependent code, which is all at the
|
||||
end of the .cpp file.</li>
|
||||
<li>Renamed a few parameters and the drvInfo strings to logically separate things that
|
||||
are general to NDArrays and things that are specific to area detectors. For example,
|
||||
the drvInfo fields IMAGE_SIZE_xxx were renamed to ARRAY_SIZE_xxx, and IMAGE_COUNTER was
|
||||
renamed to ARRAY_COUNTER.</li>
|
||||
<li>Added call to epicsExit() to all driver IOC main programs. This is important for allowing
|
||||
EPICS to exit cleanly. Without this on Linux it was often necessary to kill the IOC with ^C,
|
||||
rather than just typing "exit".</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 style="text-align: center">
|
||||
Release 1-4 (30-January-2009)</h2>
|
||||
|
||||
@@ -1,48 +1,46 @@
|
||||
For R1-5
|
||||
|
||||
- Update documentation to link to doxygen files and remove details of code
|
||||
from HTML files.
|
||||
|
||||
- Include TIFF and JPEG libraries in all applications so the plugins will work.
|
||||
|
||||
- Load the TIFF and JPEG drivers, databases and adl screens for all drivers.
|
||||
|
||||
- Make all writeXXX methods invoke the base class in the case where the
|
||||
parameter is not recognized and the number is less than the first parameter
|
||||
for this class.
|
||||
|
||||
- Implement portNameSelf in asynPortDriver (but leave it in ADBase.template).
|
||||
|
||||
- Test all drivers.
|
||||
|
||||
|
||||
Longer term:
|
||||
|
||||
General
|
||||
- Look at Marty's comments, respond
|
||||
- Documentation
|
||||
- Performance measurements
|
||||
- Implement and improve connection management
|
||||
- Make any asynBusy record, same as bo, except:
|
||||
- Does not call recGblFwdLink until VAL=0.
|
||||
- Soft device support is same as bo record.
|
||||
- Flag indicating callback from device support, don't write output.
|
||||
|
||||
asynParamBase
|
||||
asynPortDriver
|
||||
- Make it handle array interfaces with pointers?
|
||||
|
||||
NDPluginBase
|
||||
- Add all 10 dimensions to database
|
||||
- Add all 10 dimensions to database?
|
||||
|
||||
drvNDFile
|
||||
- Test reading
|
||||
|
||||
drvNDStdArrays
|
||||
File plugins
|
||||
- Implement reading
|
||||
|
||||
drvNDROI
|
||||
- Add cross-sections
|
||||
- Add cross-sections?
|
||||
- Add scaling and offset, useful when converting data types?
|
||||
|
||||
drvSimDetector driver
|
||||
- Test all image data types with all waveform data types
|
||||
- Add connection state
|
||||
|
||||
drvProsilica driver
|
||||
- Connection management
|
||||
- Sense disconnect, autoreconnect
|
||||
- Implement link callback. When matches uniqueID, call Disconnect or Connect
|
||||
- Support color
|
||||
|
||||
Other drivers
|
||||
- Roper using WinView/OLE
|
||||
- Pilatus
|
||||
- MAR-CCD
|
||||
- MAR-345
|
||||
|
||||
IDL
|
||||
- Fix image_display
|
||||
- Make TVSCL image
|
||||
Resizeable;
|
||||
- Change table widgets to text widgets or CW_field widgets
|
||||
- Use rotate rather than order keyword on tv
|
||||
- Check if data is byte and scaling is 0 to 255 don't scale the image
|
||||
- Data saving?
|
||||
- Get Stephen Mudie's code included and fixed
|
||||
- Change image_display table widgets to text widgets or CW_field widgets
|
||||
|
||||
Reference in New Issue
Block a user