areaDetector  3-12-1
EPICS areaDetector framework
NDPluginDriver.h
Go to the documentation of this file.
1 #ifndef NDPluginDriver_H
2 #define NDPluginDriver_H
3 
4 #include <set>
5 #include <epicsTypes.h>
6 #include <epicsMessageQueue.h>
7 #include <epicsThread.h>
8 #include <epicsTime.h>
9 
10 #include <NDPluginAPI.h>
11 
12 #include "asynNDArrayDriver.h"
13 
14 class Throttler;
15 
16 // This class defines the object that is contained in the std::multilist for sorting output NDArrays
17 // It contains a pointer to the NDArray and the time that the object was added to the list
18 // It defines the < operator to use the NDArray::uniqueId field as the sort key
19 
20 // We would like to hide this class definition in NDPluginDriver.cpp and just forward reference it here.
21 // That works on Visual Studio, and on gcc if instantiating plugins as heap variables with "new", but fails on gcc
22 // if instantiating plugins as automatic variables.
23 //class sortedListElement;
24 
26  public:
27  sortedListElement(NDArray *pArray, epicsTimeStamp time);
28  friend bool operator<(const sortedListElement& lhs, const sortedListElement& rhs) {
29  return (lhs.pArray_->uniqueId < rhs.pArray_->uniqueId);
30  }
32  epicsTimeStamp insertionTime_;
33 };
34 
35 #define NDPluginDriverArrayPortString "NDARRAY_PORT"
36 #define NDPluginDriverArrayAddrString "NDARRAY_ADDR"
37 #define NDPluginDriverPluginTypeString "PLUGIN_TYPE"
38 #define NDPluginDriverDroppedArraysString "DROPPED_ARRAYS"
39 #define NDPluginDriverQueueSizeString "QUEUE_SIZE"
40 #define NDPluginDriverQueueFreeString "QUEUE_FREE"
41 #define NDPluginDriverMaxThreadsString "MAX_THREADS"
42 #define NDPluginDriverNumThreadsString "NUM_THREADS"
43 #define NDPluginDriverSortModeString "SORT_MODE"
44 #define NDPluginDriverSortTimeString "SORT_TIME"
45 #define NDPluginDriverSortSizeString "SORT_SIZE"
46 #define NDPluginDriverSortFreeString "SORT_FREE"
47 #define NDPluginDriverDisorderedArraysString "DISORDERED_ARRAYS"
48 #define NDPluginDriverDroppedOutputArraysString "DROPPED_OUTPUT_ARRAYS"
49 #define NDPluginDriverEnableCallbacksString "ENABLE_CALLBACKS"
50 #define NDPluginDriverBlockingCallbacksString "BLOCKING_CALLBACKS"
51 #define NDPluginDriverProcessPluginString "PROCESS_PLUGIN"
52 #define NDPluginDriverExecutionTimeString "EXECUTION_TIME"
53 #define NDPluginDriverMinCallbackTimeString "MIN_CALLBACK_TIME"
55 #define NDPluginDriverMaxByteRateString "MAX_BYTE_RATE"
57 class NDPLUGIN_API NDPluginDriver : public asynNDArrayDriver, public epicsThreadRunable {
58 public:
59  NDPluginDriver(const char *portName, int queueSize, int blockingCallbacks,
60  const char *NDArrayPort, int NDArrayAddr, int maxAddr,
61  int maxBuffers, size_t maxMemory, int interfaceMask, int interruptMask,
62  int asynFlags, int autoConnect, int priority, int stackSize, int maxThreads,
63  bool compressionAware = false);
64  ~NDPluginDriver();
65 
66  /* These are the methods that we override from asynNDArrayDriver */
67  virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
68  virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
69  virtual asynStatus writeOctet(asynUser *pasynUser, const char *value, size_t maxChars,
70  size_t *nActual);
71  virtual asynStatus readInt32Array(asynUser *pasynUser, epicsInt32 *value,
72  size_t nElements, size_t *nIn);
73 
74  /* These are the methods that are new to this class */
75  virtual void driverCallback(asynUser *pasynUser, void *genericPointer);
76  virtual void run(void);
77  virtual asynStatus start(void);
78  void sortingTask();
79 
80 protected:
81  virtual void processCallbacks(NDArray *pArray) = 0;
82  virtual void beginProcessCallbacks(NDArray *pArray);
83  virtual asynStatus endProcessCallbacks(NDArray *pArray, bool copyArray=false, bool readAttributes=true);
84  virtual asynStatus connectToArrayPort(void);
85  virtual asynStatus setArrayInterrupt(int connect);
86 
87 protected:
88  int NDPluginDriverArrayPort;
89  #define FIRST_NDPLUGIN_PARAM NDPluginDriverArrayPort
90  int NDPluginDriverArrayAddr;
91  int NDPluginDriverPluginType;
92  int NDPluginDriverDroppedArrays;
93  int NDPluginDriverQueueSize;
94  int NDPluginDriverQueueFree;
95  int NDPluginDriverMaxThreads;
96  int NDPluginDriverNumThreads;
97  int NDPluginDriverSortMode;
98  int NDPluginDriverSortTime;
99  int NDPluginDriverSortSize;
100  int NDPluginDriverSortFree;
101  int NDPluginDriverDisorderedArrays;
102  int NDPluginDriverDroppedOutputArrays;
103  int NDPluginDriverEnableCallbacks;
104  int NDPluginDriverBlockingCallbacks;
105  int NDPluginDriverProcessPlugin;
106  int NDPluginDriverExecutionTime;
107  int NDPluginDriverMinCallbackTime;
108  int NDPluginDriverMaxByteRate;
110  NDArray *pPrevInputArray_;
111  bool throttled(NDArray *pArray);
112 
113 private:
114  void processTask();
115  asynStatus createCallbackThreads();
116  asynStatus startCallbackThreads();
117  asynStatus deleteCallbackThreads();
118  asynStatus createSortingThread();
119 
120  /* The asyn interfaces we access as a client */
121  void *asynGenericPointerInterruptPvt_;
122 
123  /* Our data */
124  int numThreads_;
125  bool pluginStarted_;
126  bool firstOutputArray_;
127  asynUser *pasynUserGenericPointer_;
128  void *asynGenericPointerPvt_;
129  asynGenericPointer *pasynGenericPointer_;
130  bool connectedToArrayPort_;
131  std::vector<epicsThread*>pThreads_;
132  epicsMessageQueue *pToThreadMsgQ_;
133  epicsMessageQueue *pFromThreadMsgQ_;
134  std::multiset<sortedListElement> sortedNDArrayList_;
135  int prevUniqueId_;
136  epicsThreadId sortingThreadId_;
137  epicsTimeStamp lastProcessTime_;
138  int dimsPrev_[ND_ARRAY_MAX_DIMS];
139  bool compressionAware_;
140  Throttler *throttler_;
141 };
142 
143 
144 #endif
Class from which actual plugin drivers are derived; derived from asynNDArrayDriver.
Definition: NDPluginDriver.h:58
Definition: NDPluginDriver.h:25
epicsTimeStamp insertionTime_
Definition: NDPluginDriver.h:32
#define ND_ARRAY_MAX_DIMS
NDArray.h.
Definition: NDArray.h:26
list value
Definition: makeDbAndEdl.py:234
friend bool operator<(const sortedListElement &lhs, const sortedListElement &rhs)
Definition: NDPluginDriver.h:28
Definition: throttler.h:6
int uniqueId
A number that must be unique for all NDArrays produced by a driver after is has started.
Definition: NDArray.h:116
sortedListElement(NDArray *pArray, epicsTimeStamp time)
Definition: NDPluginDriver.cpp:46
NDArray * pArray_
Definition: NDPluginDriver.h:31
N-dimensional array class; each array has a set of dimensions, a data type, pointer to data,...
Definition: NDArray.h:94