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
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 int index0;
00022 int index1;
00023 int index2;
00024 } NDTransformIndex_t;
00025
00026
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
00084 void processCallbacks(NDArray *pArray);
00085 asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
00086
00087
00088
00089 protected:
00090 int NDPluginTransformName;
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 int userDims[ND_ARRAY_MAX_DIMS];
00117 int realDims[ND_ARRAY_MAX_DIMS];
00118 int transformFlipsAxes(int);
00119 void setMaxSizes(int);
00120 int maxTransforms;
00121 NDTransform_t *pTransforms;
00122 int originLocation;
00123 epicsInt32 *totalArray;
00124 epicsInt32 *netArray;
00125
00126 NDTransformIndex_t transformNone(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00127 NDTransformIndex_t transformRotateCW90(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00128 NDTransformIndex_t transformRotateCCW90(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00129 NDTransformIndex_t transformRotate180(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00130 NDTransformIndex_t transformFlip0011(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00131 NDTransformIndex_t transformFlip0110(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00132 NDTransformIndex_t transformFlipX(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00133 NDTransformIndex_t transformFlipY(NDTransformIndex_t indexIn, int originLocation, int transformNumber);
00134 NDTransformIndex_t transformPixel(NDTransformIndex_t indexIn, int 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 (&LAST_TRANSFORM_PARAM - &FIRST_TRANSFORM_PARAM + 1)
00143
00144 #endif