ADCSimDetector
=====================
:author: Mark Rivers (University of Chicago)
Table of Contents
-----------------
.. contents:: Contents
Introduction
------------
This is an `EPICS `__
`areaDetector `__ driver for a simulated ADC driver.
This driver generates times-series data for 8 signals as a 2-D array [8,
NumTimePoints]. The signals are common waveforms (sine, cosine, square
wave, sawtooth, random noise, etc.) The driver was written in part to
test the new NDPluginTimeSeries plugin in ADCore R2-5. But it can also
serve as a starting point for writing drivers that are used to collect
time-series data like ADCs, waveform digitizers, etc.
Each signal in the driver describes a waveform. The equations governing
these signals are similar. The equation for the sine wave is the
following:
::
Signal[t] = Offset + Noise * random() + Amplitude * sin((time * Frequency + Phase/360.) * 2. * PI);
This driver inherits from
`asynNDArrayDriver `__. It also
implements a number parameters that are specific to the ADC simulation
detector. The `ADCSimDetector class
documentation `__
describes this class in detail.
Simulation driver specific parameters
-------------------------------------
The simulation driver-specific parameters are the following:
.. cssclass:: table-bordered table-striped table-hover
.. flat-table::
:header-rows: 2
:widths: 20 20 10 80 20 20 10
* - **Parameters for the driver as a whole, Parameter Definitions in ADCSimDetector.cpp and EPICS Record Definitions in ADCSimDetector.template**
* - Parameter index variable
- asyn interface
- Access
- Description
- drvInfo string
- EPICS record name
- EPICS record type
* - P_Acquire
- asynInt32
- r/w
- Start/stop acquisition. Values are:, 0: "Done": Stops acquisition, 1: "Acquire": Starts acquisition
- SIM_ACQUIRE
- $(P)$(R)Acquire, $(P)$(R)Acquire_RBV
- busy, bi
* - P_TimeStep
- asynFloat64
- r/w
- Time per data point
- SIM_TIME_STEP
- $(P)$(R)TimeStep, $(P)$(R)TimeStep_RBV
- ao, ai
* - NumTimePoints
- asynInt32
- r/w
- Number of time points to accumulate before calling registered plugins
- SIM_NUM_TIME_POINTS
- $(P)$(R)NumTimePoints, $(P)$(R)NumTimePoints_RBV
- longout, longin
* - P_AcquireTime
- asynFloat64
- r/w
- Total elapsed time before automatically stopping acquisition. If 0 then acquistion
continues until manually stopped. Note that this is "simulated time", i.e. the number
of time points since acquisition was started * TimeStep. This may differ from actual
time because of the processor speeds, granularity of epicsThreadSleep(), etc.
- SIM_ACQUIRE_TIME
- $(P)$(R)AcquireTime, $(P)$(R)AcquireTime_RBV
- ao, ai
* - P_ElapsedTime
- asynFloat64
- r/w
- Total elapsed time since acquisition was started.
- SIM_ELAPSED_TIME
- $(P)$(R)ElapsedTime
- ai
* - **Parameters for each signal N. Parameter Definitions in NDPluginTimeSeries.h and EPICS Record Definitions in ADCSimDetectorN.template**
* - P_Amplitude
- asynFloat64
- r/w
- The amplitude of this signal.
- SIM_AMPLITUDE
- $(P)$(R)Amplitude
- ao
* - P_Offset
- asynFloat64
- r/w
- The offset of this signal.
- SIM_OFFSET
- $(P)$(R)Offset
- ao
* - P_Phase
- asynFloat64
- r/w
- The phase of the signal in degrees.
- SIM_PHASE
- $(P)$(R)Phase
- ao
* - P_Noise
- asynFloat64
- r/w
- The noise of this signal. This value is multipled by a random number between -1 and 1 for each time point.
- SIM_NOISE
- $(P)$(R)Noise
- ao
* - P_Period
- asynFloat64
- r/w
- The period of this signal. The frequency is calculated from the period.
- SIM_PERIOD
- $(P)$(R)Period
- ao
* - P_Frequency
- asynFloat64
- r/o
- The frequency of this signal, calculated from the period.
- SIM_FREQUENCY
- $(P)$(R)Frequency
- ai
Configuration
-------------
The ADCimDetector driver is created with the ADCimDetectorConfig
command, either from C/C++ or from the EPICS IOC shell.
::
int ADCSimDetectorConfig(const char *portName,
int numTimePoints, int dataType,
int maxBuffers, size_t maxMemory,
int priority, int stackSize)
The simDetector-specific fields in this command are:
- ``numTimePoints`` Initial number of time points.
- ``dataType`` Initial data type of the detector data. These are the
enum values for NDDataType_t, i.e.
- 0=NDInt8
- 1=NDUInt8
- 2=NDInt16
- 3=NDUInt16
- 4=NDInt32
- 5=NDUInt32
- 6=NDFloat32
- 7=NDFloat64
For details on the meaning of the other parameters to this function
refer to the detailed documentation on the simDetectorConfig function in
the `ADCSimDetector.cpp
documentation `__
and in the documentation for the constructor for the `ADCSimDetector
class `__.
There an example IOC boot directory and startup script
(`iocBoot/iocADCSimDetector/st.cmd) `__
provided with ADExample.
MEDM screens
------------
The following is the MEDM screen simDetector.adl for the simulation
detector.
.. container::
.. rubric:: ADCSimDetector.adl
:name: adcsimdetector.adl
|ADCSimDetector.png|
The NDPluginTimeSeries is used to collect the time series data from the
ADCSimDetector, perform optional averaging. In this case it is being
used in circular buffer mode. The NDArrays it produces are being used by
the NDPluginFFT plugin to compute Fast Fourier Transforms.
.. container::
.. rubric:: NDPluginTimeSeries.adl
:name: ndplugintimeseries.adl
|ADCSimDetectorTimeSeriesPlugin.png|
This is a plot for the sin(x)*cos(x) output. This screen contains some
of the controls for the time series plugin.
.. container::
.. rubric:: NDTimeSeriesPlot.adl
:name: ndtimeseriesplot.adl
|ADCSimDetectorSinCosPlot.png|
This is a combined plot for the square wave output. It contains the
time-series data, as well as the real, imaginary, and absolute value of
the FFT. Note that the square wave FFT contains the fundamental
frequency of 5 Hz, and all of the odd harmonics.
.. container::
.. rubric:: NDPluginTimeSeries.adl
:name: ndplugintimeseries.adl-1
|ADCSimDetectorSquareWavePlotAll.png|
.. |ADCSimDetector.png| image:: ADCSimDetector.png
.. |ADCSimDetectorTimeSeriesPlugin.png| image:: ADCSimDetectorTimeSeriesPlugin.png
.. |ADCSimDetectorSinCosPlot.png| image:: ADCSimDetectorSinCosPlot.png
.. |ADCSimDetectorSquareWavePlotAll.png| image:: ADCSimDetectorSquareWavePlotAll.png