areaDetector 1-9
|
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