areaDetector 1-9
/home/epics/devel/areaDetector/ADApp/pluginSrc/NDPluginTransform.h
Go to the documentation of this file.
00001 #ifndef NDPluginTransform_H
00002 #define NDPluginTransform_H
00003 
00004 #include <epicsTypes.h>
00005 #include <asynStandardInterfaces.h>
00006 
00007 #include "NDPluginDriver.h"
00008 
00009 
00010 /* The following enum is for each of the Transforms */
00011 #define NDPluginTransformFirstTransformNParam NDPluginDriverLastParam
00012 
00014 typedef struct NDTransform {
00015     NDDimension_t dims[ND_ARRAY_MAX_DIMS];
00016     int type;
00017 } NDTransform_t;
00018 
00020 typedef struct {
00021     size_t index0;
00022     size_t index1;
00023     size_t index2;
00024 } NDTransformIndex_t;
00025 
00026 /* Enums to describe the types of transformations */
00027 typedef enum {
00028     TransformNone,
00029     TransformRotateCW90,
00030     TransformRotateCCW90,
00031     TransformRotate180,
00032     TransformFlip0011,
00033     TransformFlip0110,
00034     TransformFlipX,
00035     TransformFlipY,
00036 } NDPluginTransformType_t;
00037 
00039 typedef enum {
00040     TransformOriginLL,
00041     TransformOriginUL,
00042     TransformOriginLR,
00043     TransformOriginUR,
00044 } NDPluginTransformOrigin_t;
00045 
00048 #define NDPluginTransformNameString         "NAME"
00049 #define NDPluginTransform1TypeString        "TYPE1"
00050 #define NDPluginTransform2TypeString        "TYPE2"
00051 #define NDPluginTransform3TypeString        "TYPE3"
00052 #define NDPluginTransform4TypeString        "TYPE4"
00053 #define NDPluginTransformOriginString       "ORIGIN"
00054 #define NDPluginTransform1Dim0MaxSizeString "T1_DIM0_MAX_SIZE"
00055 #define NDPluginTransform1Dim1MaxSizeString "T1_DIM1_MAX_SIZE"
00056 #define NDPluginTransform1Dim2MaxSizeString "T1_DIM2_MAX_SIZE"
00057 #define NDPluginTransform2Dim0MaxSizeString "T2_DIM0_MAX_SIZE"
00058 #define NDPluginTransform2Dim1MaxSizeString "T2_DIM1_MAX_SIZE"
00059 #define NDPluginTransform2Dim2MaxSizeString "T2_DIM2_MAX_SIZE"
00060 #define NDPluginTransform3Dim0MaxSizeString "T3_DIM0_MAX_SIZE"
00061 #define NDPluginTransform3Dim1MaxSizeString "T3_DIM1_MAX_SIZE"
00062 #define NDPluginTransform3Dim2MaxSizeString "T3_DIM2_MAX_SIZE"
00063 #define NDPluginTransform4Dim0MaxSizeString "T4_DIM0_MAX_SIZE"
00064 #define NDPluginTransform4Dim1MaxSizeString "T4_DIM1_MAX_SIZE"
00065 #define NDPluginTransform4Dim2MaxSizeString "T4_DIM2_MAX_SIZE"
00066 #define NDPluginTransformArraySize0String   "ARRAY_SIZE_0"
00067 #define NDPluginTransformArraySize1String   "ARRAY_SIZE_1"
00068 #define NDPluginTransformArraySize2String   "ARRAY_SIZE_2"
00069 
00070 
00071 typedef NDTransformIndex_t (*transformFunctions_t) (NDTransformIndex_t, int, int) ;
00072 
00073 static const char* pluginName = "NDPluginTransform";
00074 
00075 
00077 class NDPluginTransform : public NDPluginDriver {
00078 public:
00079     NDPluginTransform(const char *portName, int queueSize, int blockingCallbacks,
00080                  const char *NDArrayPort, int NDArrayAddr,
00081                  int maxBuffers, size_t maxMemory,
00082                  int priority, int stackSize);
00083     /* These methods override the virtual methods in the base class */
00084     void processCallbacks(NDArray *pArray);
00085     asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
00086 
00087     /* These methods are unique to this class */
00088 
00089 protected:
00090     int NDPluginTransformName;           /* (asynOctet;   r/w) Name of this Transform */
00091     #define FIRST_TRANSFORM_PARAM NDPluginTransformName
00092     int NDPluginTransform1Type;
00093     int NDPluginTransform2Type;
00094     int NDPluginTransform3Type;
00095     int NDPluginTransform4Type;
00096     int NDPluginTransformOrigin;
00097     int NDPluginTransform1Dim0MaxSize;
00098     int NDPluginTransform1Dim1MaxSize;
00099     int NDPluginTransform1Dim2MaxSize;
00100     int NDPluginTransform2Dim0MaxSize;
00101     int NDPluginTransform2Dim1MaxSize;
00102     int NDPluginTransform2Dim2MaxSize;
00103     int NDPluginTransform3Dim0MaxSize;
00104     int NDPluginTransform3Dim1MaxSize;
00105     int NDPluginTransform3Dim2MaxSize;
00106     int NDPluginTransform4Dim0MaxSize;
00107     int NDPluginTransform4Dim1MaxSize;
00108     int NDPluginTransform4Dim2MaxSize;
00109     int NDPluginTransformArraySize0;
00110     int NDPluginTransformArraySize1;
00111     int NDPluginTransformArraySize2;
00112     #define LAST_TRANSFORM_PARAM NDPluginTransformArraySize2
00113 
00114 private:
00115 
00116     size_t userDims[ND_ARRAY_MAX_DIMS];
00117     size_t realDims[ND_ARRAY_MAX_DIMS];
00118     int transformFlipsAxes(int);
00119     void setMaxSizes(int);
00120     int maxTransforms;
00121     NDTransform_t *pTransforms;    /* Array of NDTransform structures */
00122     size_t originLocation;
00123     epicsInt32 *totalArray;
00124     epicsInt32 *netArray;
00125 
00126     NDTransformIndex_t transformNone(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00127     NDTransformIndex_t transformRotateCW90(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00128     NDTransformIndex_t transformRotateCCW90(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00129     NDTransformIndex_t transformRotate180(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00130     NDTransformIndex_t transformFlip0011(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00131     NDTransformIndex_t transformFlip0110(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00132     NDTransformIndex_t transformFlipX(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00133     NDTransformIndex_t transformFlipY(NDTransformIndex_t indexIn, size_t originLocation, int transformNumber);
00134     NDTransformIndex_t transformPixel(NDTransformIndex_t indexIn, size_t originLocation);
00135     void transform2DArray(NDArray *inArray, NDArray *outArray);
00136     void transform3DArray(NDArray *inArray, NDArray *outArray);
00137     void moveStdPixel(NDArray *inArray, NDTransformIndex_t pixelIndexIn, NDArray *outArray, NDTransformIndex_t pixelIndexOut);
00138     void moveRGB1Pixel(NDArray *inArray, NDTransformIndex_t pixelIndexIn, NDArray *outArray, NDTransformIndex_t pixelIndexOut);
00139     void moveRGB2Pixel(NDArray *inArray, NDTransformIndex_t pixelIndexIn, NDArray *outArray, NDTransformIndex_t pixelIndexOut);
00140 
00141 };
00142 #define NUM_TRANSFORM_PARAMS ((int)(&LAST_TRANSFORM_PARAM - &FIRST_TRANSFORM_PARAM + 1))
00143 
00144 #endif