00001 #ifndef NDPluginStats_H
00002 #define NDPluginStats_H
00003
00004 #include <epicsTypes.h>
00005 #include <asynStandardInterfaces.h>
00006
00007 #include "NDPluginDriver.h"
00008
00009 typedef struct NDStats {
00010 int nElements;
00011 double total;
00012 double net;
00013 double mean;
00014 double sigma;
00015 double min;
00016 double max;
00017 } NDStats_t;
00018
00019 typedef enum {
00020 profAverage,
00021 profThreshold,
00022 profCentroid,
00023 profCursor
00024 } NDStatProfileType;
00025
00026 #define MAX_PROFILE_TYPES profCursor+1
00027
00028
00029 #define NDPluginStatsComputeStatisticsString "COMPUTE_STATISTICS"
00030 #define NDPluginStatsBgdWidthString "BGD_WIDTH"
00031 #define NDPluginStatsMinValueString "MIN_VALUE"
00032 #define NDPluginStatsMaxValueString "MAX_VALUE"
00033 #define NDPluginStatsMeanValueString "MEAN_VALUE"
00034 #define NDPluginStatsSigmaValueString "SIGMA_VALUE"
00035 #define NDPluginStatsTotalString "TOTAL"
00036 #define NDPluginStatsNetString "NET"
00037
00038
00039 #define NDPluginStatsComputeCentroidString "COMPUTE_CENTROID"
00040 #define NDPluginStatsCentroidThresholdString "CENTROID_THRESHOLD"
00041 #define NDPluginStatsCentroidXString "CENTROIDX_VALUE"
00042 #define NDPluginStatsCentroidYString "CENTROIDY_VALUE"
00043 #define NDPluginStatsSigmaXString "SIGMAX_VALUE"
00044 #define NDPluginStatsSigmaYString "SIGMAY_VALUE"
00045 #define NDPluginStatsSigmaXYString "SIGMAXY_VALUE"
00046
00047
00048 #define NDPluginStatsComputeProfilesString "COMPUTE_PROFILES"
00049 #define NDPluginStatsProfileSizeXString "PROFILE_SIZE_X"
00050 #define NDPluginStatsProfileSizeYString "PROFILE_SIZE_Y"
00051 #define NDPluginStatsCursorXString "CURSOR_X"
00052 #define NDPluginStatsCursorYString "CURSOR_Y"
00053 #define NDPluginStatsProfileAverageXString "PROFILE_AVERAGE_X"
00054 #define NDPluginStatsProfileAverageYString "PROFILE_AVERAGE_Y"
00055 #define NDPluginStatsProfileThresholdXString "PROFILE_THRESHOLD_X"
00056 #define NDPluginStatsProfileThresholdYString "PROFILE_THRESHOLD_Y"
00057 #define NDPluginStatsProfileCentroidXString "PROFILE_CENTROID_X"
00058 #define NDPluginStatsProfileCentroidYString "PROFILE_CENTROID_Y"
00059 #define NDPluginStatsProfileCursorXString "PROFILE_CURSOR_X"
00060 #define NDPluginStatsProfileCursorYString "PROFILE_CURSOR_Y"
00061
00062
00063 #define NDPluginStatsComputeHistogramString "COMPUTE_HISTOGRAM"
00064 #define NDPluginStatsHistSizeString "HIST_SIZE"
00065 #define NDPluginStatsHistMinString "HIST_MIN"
00066 #define NDPluginStatsHistMaxString "HIST_MAX"
00067 #define NDPluginStatsHistEntropyString "HIST_ENTROPY"
00068 #define NDPluginStatsHistArrayString "HIST_ARRAY"
00069
00070
00071
00072 #define NDPluginStatsCallbackPeriodString "CALLBACK_PERIOD"
00073 #define NDPluginStatsTotalArrayString "TOTAL_ARRAY"
00074 #define NDPluginStatsNetArrayString "NET_ARRAY"
00075
00081 class NDPluginStats : public NDPluginDriver {
00082 public:
00083 NDPluginStats(const char *portName, int queueSize, int blockingCallbacks,
00084 const char *NDArrayPort, int NDArrayAddr,
00085 int maxBuffers, size_t maxMemory,
00086 int priority, int stackSize);
00087
00088 void processCallbacks(NDArray *pArray);
00089 asynStatus readFloat64Array(asynUser *pasynUser, epicsFloat64 *value, size_t nElements, size_t *nIn);
00090 asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
00091 asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
00092
00093 template <typename epicsType> asynStatus doComputeCentroidT(NDArray *pArray);
00094 asynStatus doComputeCentroid(NDArray *pArray);
00095 template <typename epicsType> asynStatus doComputeProfilesT(NDArray *pArray);
00096 asynStatus doComputeProfiles(NDArray *pArray);
00097 template <typename epicsType> asynStatus doComputeHistogramT(NDArray *pArray);
00098 asynStatus doComputeHistogram(NDArray *pArray);
00099
00100 protected:
00101 int NDPluginStatsComputeStatistics;
00102 #define FIRST_NDPLUGIN_STATS_PARAM NDPluginStatsComputeStatistics
00103
00104 int NDPluginStatsBgdWidth;
00105 int NDPluginStatsMinValue;
00106 int NDPluginStatsMaxValue;
00107 int NDPluginStatsMeanValue;
00108 int NDPluginStatsSigmaValue;
00109 int NDPluginStatsTotal;
00110 int NDPluginStatsNet;
00111
00112
00113 int NDPluginStatsComputeCentroid;
00114 int NDPluginStatsCentroidThreshold;
00115 int NDPluginStatsCentroidX;
00116 int NDPluginStatsCentroidY;
00117 int NDPluginStatsSigmaX;
00118 int NDPluginStatsSigmaY;
00119 int NDPluginStatsSigmaXY;
00120
00121
00122 int NDPluginStatsComputeProfiles;
00123 int NDPluginStatsProfileSizeX;
00124 int NDPluginStatsProfileSizeY;
00125 int NDPluginStatsCursorX;
00126 int NDPluginStatsCursorY;
00127 int NDPluginStatsProfileAverageX;
00128 int NDPluginStatsProfileAverageY;
00129 int NDPluginStatsProfileThresholdX;
00130 int NDPluginStatsProfileThresholdY;
00131 int NDPluginStatsProfileCentroidX;
00132 int NDPluginStatsProfileCentroidY;
00133 int NDPluginStatsProfileCursorX;
00134 int NDPluginStatsProfileCursorY;
00135
00136
00137 int NDPluginStatsComputeHistogram;
00138 int NDPluginStatsHistSize;
00139 int NDPluginStatsHistMin;
00140 int NDPluginStatsHistMax;
00141 int NDPluginStatsHistEntropy;
00142 int NDPluginStatsHistArray;
00143
00144
00145 int NDPluginStatsCallbackPeriod;
00146 int NDPluginStatsTotalArray;
00147 int NDPluginStatsNetArray;
00148
00149 #define LAST_NDPLUGIN_STATS_PARAM NDPluginStatsNetArray
00150
00151 private:
00152 double centroidThreshold;
00153 double centroidX;
00154 double centroidY;
00155 double sigmaX;
00156 double sigmaY;
00157 double sigmaXY;
00158 double *profileX[MAX_PROFILE_TYPES];
00159 double *profileY[MAX_PROFILE_TYPES];
00160 int profileSizeX;
00161 int profileSizeY;
00162 int cursorX;
00163 int cursorY;
00164 epicsInt32 *totalArray;
00165 epicsInt32 *netArray;
00166 int histogramSize;
00167 int histSizeNew;
00168 double *histogram;
00169 double histMin;
00170 double histMax;
00171 double histEntropy;
00172 };
00173 #define NUM_NDPLUGIN_STATS_PARAMS (&LAST_NDPLUGIN_STATS_PARAM - &FIRST_NDPLUGIN_STATS_PARAM + 1)
00174
00175 #endif