quadEM  7-0
drvQuadEM.h
Go to the documentation of this file.
1 /*
2  * drvQuadEM.h
3  *
4  * Asyn driver base class that inherits from the asynPortDriver class to control quad electrometers
5  *
6  * Author: Mark Rivers
7  *
8  * Created June 14, 2012
9  */
10 
11 #include <epicsExit.h>
12 #include <epicsRingBytes.h>
13 #include <epicsMessageQueue.h>
14 #include "asynNDArrayDriver.h"
15 
16 /* These are the drvInfo strings that are used to identify the parameters.
17  * They are used by asyn clients, including standard asyn device support */
18 #define P_AcquireModeString "QE_ACQUIRE_MODE" /* asynInt32, r/w */
19 #define P_CurrentOffsetString "QE_CURRENT_OFFSET" /* asynFloat64, r/w */
20 #define P_CurrentScaleString "QE_CURRENT_SCALE" /* asynFloat64, r/w */
21 #define P_PositionOffsetString "QE_POSITION_OFFSET" /* asynFloat64, r/w */
22 #define P_PositionScaleString "QE_POSITION_SCALE" /* asynFloat64, r/w */
23 #define P_GeometryString "QE_GEOMETRY" /* asynInt32, r/w */
24 #define P_DoubleDataString "QE_DOUBLE_DATA" /* asynFloat64, r/o */
25 #define P_IntArrayDataString "QE_INT_ARRAY_DATA" /* asynInt32Array, r/o */
26 #define P_RingOverflowsString "QE_RING_OVERFLOWS" /* asynInt32, r/o */
27 #define P_ReadDataString "QE_READ_DATA" /* asynInt32, r/w */
28 #define P_PingPongString "QE_PING_PONG" /* asynInt32, r/w */
29 #define P_IntegrationTimeString "QE_INTEGRATION_TIME" /* asynFloat64, r/w */
30 #define P_SampleTimeString "QE_SAMPLE_TIME" /* asynFloat64, r/o */
31 #define P_RangeString "QE_RANGE" /* asynInt32, r/w */
32 #define P_ResetString "QE_RESET" /* asynInt32, r/w */
33 #define P_TriggerModeString "QE_TRIGGER_MODE" /* asynInt32, r/w */
34 #define P_TriggerPolarityString "QE_TRIGGER_POLARITY" /* asynInt32, r/w */
35 #define P_NumChannelsString "QE_NUM_CHANNELS" /* asynInt32, r/w */
36 #define P_BiasStateString "QE_BIAS_STATE" /* asynInt32, r/w */
37 #define P_BiasVoltageString "QE_BIAS_VOLTAGE" /* asynFloat64, r/w */
38 #define P_BiasInterlockString "QE_BIAS_INTERLOCK" /* asynInt32, r/w */
39 #define P_HVSReadbackString "QE_HVS_READBACK" /* asynInt32, r/w */
40 #define P_HVVReadbackString "QE_HVV_READBACK" /* asynFloat64, r/w */
41 #define P_HVIReadbackString "QE_HVI_READBACK" /* asynFloat64, r/w */
42 #define P_TemperatureString "QE_TEMPERATURE" /* asynFloat64, r/w */
43 #define P_ReadStatusString "QE_READ_STATUS" /* asynInt32, r/w */
44 #define P_ResolutionString "QE_RESOLUTION" /* asynInt32, r/w */
45 #define P_ValuesPerReadString "QE_VALUES_PER_READ" /* asynInt32, r/w */
46 #define P_ReadFormatString "QE_READ_FORMAT" /* asynInt32, r/w */
47 #define P_AveragingTimeString "QE_AVERAGING_TIME" /* asynFloat64, r/w */
48 #define P_NumAverageString "QE_NUM_AVERAGE" /* asynInt32, r/o */
49 #define P_NumAveragedString "QE_NUM_AVERAGED" /* asynInt32, r/o */
50 #define P_NumAcquireString "QE_NUM_ACQUIRE" /* asynInt32, r/o */
51 #define P_NumAcquiredString "QE_NUM_ACQUIRED" /* asynInt32, r/o */
52 #define P_ModelString "QE_MODEL" /* asynInt32, r/w */
53 #define P_FirmwareString "QE_FIRMWARE" /* asynOctet, r/w */
54 
55 
56 /* Models */
57 typedef enum {
59  QE_ModelAPS_EM, // Steve Ross' electrometer
63  QE_ModelAH501BE, // Elettra version of AH501B. Different firmware from CaenEls
70 } QEModel_t;
71 
72 /* These enums give the offsets into the data array for each value */
73 typedef enum {
85 } QEData_t;
86 
87 typedef enum {
90 } QEGeometry_t;
91 
92 /* Acquire modes */
93 typedef enum {
98 
99 /* Trigger modes */
100 typedef enum {
107 
108 /* Trigger polarity */
109 typedef enum {
112 
114 
115 
116 /* Read format */
117 typedef enum {
121 
122 
123 #define QE_MAX_DATA (QEPositionY+1)
124 #define QE_MAX_INPUTS 4
125 #define QE_DEFAULT_RING_BUFFER_SIZE 2048
126 
128 class drvQuadEM : public asynNDArrayDriver {
129 public:
130  drvQuadEM(const char *portName, int ringBufferSize);
131 
132  /* These are the methods that we override from asynPortDriver */
133  virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
134  virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
135  virtual void exitHandler();
136  void callbackTask();
137 
138 protected:
141  #define FIRST_QE_COMMAND P_AcquireMode
154  int P_Range;
155  int P_Reset;
175  int P_Model;
177  // We cache these values so we don't need to call getIntegerParam inside the
178  // fast data reading loop
184 
185  void computePositions(epicsFloat64 raw[QE_MAX_INPUTS]);
186  virtual asynStatus readStatus()=0;
187  virtual asynStatus reset()=0;
188  virtual asynStatus setAcquire(epicsInt32 value);
189  virtual asynStatus setAcquireMode(epicsInt32 value);
190  virtual asynStatus setAveragingTime(epicsFloat64 value);
191  virtual asynStatus setBiasState(epicsInt32 value);
192  virtual asynStatus setBiasVoltage(epicsFloat64 value);
193  virtual asynStatus setBiasInterlock(epicsInt32 value);
194  virtual asynStatus setIntegrationTime(epicsFloat64 value);
195  virtual asynStatus setNumChannels(epicsInt32 value);
196  virtual asynStatus setNumAcquire(epicsInt32 value);
197  virtual asynStatus setPingPong(epicsInt32 value);
198  virtual asynStatus setRange(epicsInt32 value);
199  virtual asynStatus setReadFormat(epicsInt32 value);
200  virtual asynStatus setResolution(epicsInt32 value);
201  virtual asynStatus setTriggerMode(epicsInt32 value);
202  virtual asynStatus setTriggerPolarity(epicsInt32 value);
203  virtual asynStatus setValuesPerRead(epicsInt32 value);
204  virtual asynStatus triggerCallbacks();
205 
206 private:
207  virtual asynStatus doDataCallbacks(int numRead);
208  int ringCount_;
209  int rawCount_;
210  epicsRingBytesId ringBuffer_;
211  epicsMessageQueueId msgQId_;
212 
213 };
virtual asynStatus triggerCallbacks()
Definition: drvQuadEM.cpp:243
virtual asynStatus readStatus()=0
int P_ReadData
Definition: drvQuadEM.h:150
Definition: drvQuadEM.h:58
int P_HVSReadback
Definition: drvQuadEM.h:162
Definition: drvQuadEM.h:68
Definition: drvQuadEM.h:60
int P_IntArrayData
Definition: drvQuadEM.h:148
virtual asynStatus setTriggerPolarity(epicsInt32 value)
Definition: drvQuadEM.cpp:625
int numChannels_
Definition: drvQuadEM.h:180
int P_AveragingTime
Definition: drvQuadEM.h:170
Definition: drvQuadEM.h:119
Definition: drvQuadEM.h:76
int P_Range
Definition: drvQuadEM.h:154
int P_Model
Definition: drvQuadEM.h:175
int P_SampleTime
Definition: drvQuadEM.h:153
int P_BiasVoltage
Definition: drvQuadEM.h:160
Definition: drvQuadEM.h:102
Base class to control the quad electrometer.
Definition: drvQuadEM.h:128
int P_NumAcquired
Definition: drvQuadEM.h:174
Definition: drvQuadEM.h:61
Definition: drvQuadEM.h:82
int P_NumChannels
Definition: drvQuadEM.h:158
#define QE_MAX_INPUTS
Definition: drvQuadEM.h:124
QEAcquireMode_t
Definition: drvQuadEM.h:93
QETriggerMode_t
Definition: drvQuadEM.h:100
int P_Temperature
Definition: drvQuadEM.h:165
virtual asynStatus setAveragingTime(epicsFloat64 value)
Definition: drvQuadEM.cpp:613
int P_CurrentScale
Definition: drvQuadEM.h:143
Definition: drvQuadEM.h:105
Definition: drvQuadEM.h:83
Definition: drvQuadEM.h:77
virtual asynStatus setReadFormat(epicsInt32 value)
Definition: drvQuadEM.cpp:622
int P_ReadStatus
Definition: drvQuadEM.h:166
Definition: drvQuadEM.h:88
int valuesPerRead_
Definition: drvQuadEM.h:181
QETriggerPolarity_t
Definition: drvQuadEM.h:109
int P_CurrentOffset
Definition: drvQuadEM.h:142
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value)
Called when asyn clients call pasynInt32-&gt;write().
Definition: drvQuadEM.cpp:376
char * portName
The name of this asyn port.
Definition: asynPortDriver.h:201
int P_NumAveraged
Definition: drvQuadEM.h:172
int P_Reset
Definition: drvQuadEM.h:155
Definition: drvQuadEM.h:101
virtual asynStatus setResolution(epicsInt32 value)
Definition: drvQuadEM.cpp:623
int resolution_
Definition: drvQuadEM.h:179
int P_TriggerPolarity
Definition: drvQuadEM.h:157
Definition: drvQuadEM.h:74
virtual void exitHandler()
Definition: drvQuadEM.cpp:611
This is the class from which NDArray drivers are derived; implements the asynGenericPointer functions...
Definition: asynNDArrayDriver.h:132
Definition: drvQuadEM.h:75
Definition: drvQuadEM.h:84
virtual asynStatus setRange(epicsInt32 value)
Definition: drvQuadEM.cpp:621
Definition: drvQuadEM.h:111
Definition: drvQuadEM.h:103
virtual asynStatus setBiasVoltage(epicsFloat64 value)
Definition: drvQuadEM.cpp:615
Definition: drvQuadEM.h:80
QEData_t
Definition: drvQuadEM.h:73
int P_NumAcquire
Definition: drvQuadEM.h:173
virtual asynStatus setIntegrationTime(epicsFloat64 value)
Definition: drvQuadEM.cpp:617
int P_NumAverage
Definition: drvQuadEM.h:171
drvQuadEM(const char *portName, int ringBufferSize)
Constructor for the drvQuadEM class.
Definition: drvQuadEM.cpp:50
virtual asynStatus setBiasInterlock(epicsInt32 value)
Definition: drvQuadEM.cpp:616
virtual asynStatus reset()=0
Downloads all of the current EPICS settings to the electrometer.
Definition: drvQuadEM.cpp:563
int P_BiasState
Definition: drvQuadEM.h:159
virtual asynStatus setValuesPerRead(epicsInt32 value)
Definition: drvQuadEM.cpp:626
int P_ReadFormat
Definition: drvQuadEM.h:169
int P_DoubleData
Definition: drvQuadEM.h:147
int P_PingPong
Definition: drvQuadEM.h:151
int P_RingOverflows
Definition: drvQuadEM.h:149
Definition: drvQuadEM.h:81
int P_HVIReadback
Definition: drvQuadEM.h:164
int P_BiasInterlock
Definition: drvQuadEM.h:161
int P_ValuesPerRead
Definition: drvQuadEM.h:168
int P_HVVReadback
Definition: drvQuadEM.h:163
void computePositions(epicsFloat64 raw[QE_MAX_INPUTS])
This function computes the sums, diffs and positions, and does callbacks.
Definition: drvQuadEM.cpp:156
Definition: drvQuadEM.h:67
Definition: drvQuadEM.h:79
QEGeometry_t
Definition: drvQuadEM.h:87
Definition: drvQuadEM.h:66
virtual asynStatus setNumAcquire(epicsInt32 value)
Definition: drvQuadEM.cpp:619
Definition: drvQuadEM.h:65
Definition: drvQuadEM.h:118
Definition: drvQuadEM.h:69
virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value)
Called when asyn clients call pasynFloat64-&gt;write().
Definition: drvQuadEM.cpp:490
Definition: drvQuadEM.h:62
Definition: drvQuadEM.h:63
virtual asynStatus setBiasState(epicsInt32 value)
Definition: drvQuadEM.cpp:614
int P_TriggerMode
Definition: drvQuadEM.h:156
Definition: drvQuadEM.h:59
virtual asynStatus setPingPong(epicsInt32 value)
Definition: drvQuadEM.cpp:620
int numAcquired_
Definition: drvQuadEM.h:183
Definition: drvQuadEM.h:95
Definition: drvQuadEM.h:78
virtual asynStatus setAcquire(epicsInt32 value)
Starts and stops the electrometer.
Definition: drvQuadEM.cpp:546
Definition: drvQuadEM.h:64
virtual asynStatus setTriggerMode(epicsInt32 value)
Definition: drvQuadEM.cpp:624
void callbackTask()
Definition: drvQuadEM.cpp:329
int P_IntegrationTime
Definition: drvQuadEM.h:152
Definition: drvQuadEM.h:96
Definition: drvQuadEM.h:94
int P_AcquireMode
Values used for pasynUser-&gt;reason, and indexes into the parameter library.
Definition: drvQuadEM.h:140
Definition: drvQuadEM.h:89
QEReadFormat_t
Definition: drvQuadEM.h:117
int P_Resolution
Definition: drvQuadEM.h:167
Definition: drvQuadEM.h:110
QEModel_t
Definition: drvQuadEM.h:57
virtual asynStatus setAcquireMode(epicsInt32 value)
Definition: drvQuadEM.cpp:612
int P_PositionOffset
Definition: drvQuadEM.h:144
int acquiring_
Definition: drvQuadEM.h:182
Definition: drvQuadEM.h:104
int P_PositionScale
Definition: drvQuadEM.h:145
int P_Geometry
Definition: drvQuadEM.h:146
int P_Firmware
Definition: drvQuadEM.h:176
virtual asynStatus setNumChannels(epicsInt32 value)
Definition: drvQuadEM.cpp:618