00001
00009 #ifndef __OCAMERA_H__
00010 #define __OCAMERA_H__
00011
00012
00014 struct OCameraImage
00015 {
00016 unsigned char *pData;
00017 long nSeqNr;
00018 long nTimeSec;
00019 long nTimeMicroSec;
00020 long nSize;
00021 long nStatus;
00022 long nTrigCount;
00023 };
00024
00026 struct OCameraSequenceBuffer
00027 {
00028 unsigned long nSize;
00029 void *pBuf;
00030 };
00031
00033 struct OCameraSequenceStorage
00034 {
00035 unsigned long nBufs;
00036 OCameraSequenceBuffer *pBufs;
00037 };
00038
00040 struct OCameraSampleData
00041 {
00042 unsigned long E0 : 1;
00043 unsigned long E1 : 1;
00044 unsigned long A0 : 1;
00045 unsigned long A1 : 1;
00046 unsigned long A2 : 1;
00047 unsigned long A3 : 1;
00048 };
00049
00051 struct OCameraSequenceImage
00052 {
00053 unsigned long nOfs;
00054 long nSeqNr;
00055 long nTimeSec;
00056 long nTimeMicroSec;
00057 long nSize;
00058 OCameraSampleData oSamples;
00059 OCameraSequenceImage *next;
00060 OCameraSequenceImage *prev;
00061 };
00062
00064 struct OCameraSequence
00065 {
00066 typedef enum
00067 {
00068 RES_OK = 0,
00069 RES_ERR_Z_TOO_LARGE = 1,
00070 RES_ERR_A_WRONG = 2,
00071 RES_ERR_Z_t_TOO_LARGE = 4,
00072 RES_ERR_ACQ_IMPOSSIBLE = 8,
00073 RES_ABORTED = 16,
00074 RES_FINISHED = 0,
00075 RES_NOT_INITIALIZED = 32,
00076 RES_NOT_STARTED = 64,
00077 RES_RUNNING = 128
00078 }
00079 eResult;
00080
00081 eResult result;
00082 unsigned long nImages;
00083 long nTriggerSec;
00084 long nTriggerMicroSec;
00085 OCameraSequenceImage *head;
00086 OCameraSequenceImage *tail;
00087
00088 static char *pcGetResultString(eResult enRes);
00089 };
00090
00091
00092
00093
00111 class OCamera
00112 {
00113 public:
00114
00115
00116
00118 typedef enum
00119 {
00120 CAM_TYPE_MT9V403 = 3,
00121 CAM_TYPE_GENERIC = 4,
00122 CAM_TYPE_IBIS1300 = 5,
00123 CAM_TYPE_MT9V022 = 6
00124 }
00125 eCameraType;
00126
00128 typedef enum
00129 {
00130 ACQ_MODE_STOP = 1,
00131 ACQ_MODE_SINGLE_SHOT = 2,
00132 ACQ_MODE_FREE_RUN = 3,
00133 ACQ_MODE_SELECT_SHOT = 4,
00134 ACQ_MODE_FPGA_SINGLE_SHOT = 5,
00135 ACQ_MODE_FPGA_CONTINUOUS = 6,
00136 ACQ_MODE_FREE_RUN_SLAVE = 8,
00137 ACQ_MODE_SEQUENCE_MASTER = 9,
00138 ACQ_MODE_SEQUENCE_SLAVE = 10,
00139 ACQ_MODE_FREE_RUN_SLAVE_STOP = 11
00140 }
00141 eAcqMode;
00142
00144 typedef enum
00145 {
00146 TRIG_SRC_SOFTWARE = 1,
00147 TRIG_SRC_EXTERNAL_E0 = 2,
00148 TRIG_SRC_EXTERNAL_E1 = 3
00149 }
00150 eTrigSource;
00151
00153 typedef enum
00154 {
00155 TRIG_POL_ACTIVE_HIGH = 1,
00156 TRIG_POL_ACTIVE_LOW = 2
00157 }
00158 eTrigPolarity;
00159
00161 typedef enum
00162 {
00163 ILL_MODE_OFF = 1,
00164 ILL_MODE_NORMAL = 2,
00165 ILL_MODE_PULSED = 3
00166 }
00167 eIllMode;
00168
00170 typedef enum
00171 {
00172 ILL_MODE_EXT_OFF = 0,
00173 ILL_MODE_EXT_ON_POSITIVE = 1,
00174 ILL_MODE_EXT_ON_NEGATIVE = 2
00175 }
00176 eIllModeExt;
00177
00182 typedef enum
00183 {
00184 FREQU_20MHz = 0,
00185 FREQU_40MHz = 1,
00186 FREQU_50MHz = 2,
00187 FREQU_60MHz = 3
00188 }
00189 eFrequency;
00190
00192 typedef enum
00193 {
00194 JPEG_QUALITY_LOW = 0,
00195 JPEG_QUALITY_MEDIUM = 1,
00196 JPEG_QUALITY_GOOD = 2,
00197 JPEG_QUALITY_EXCELLENT = 3
00198 }
00199 eJPEGQuality;
00200
00202 typedef enum
00203 {
00204 PRIO_FIRST_POINT = 0,
00205 PRIO_LAST_POINT = 1,
00206 PRIO_LARGEST_FIRST = 2,
00209 PRIO_LARGEST_LAST = 3
00212 }
00213 ePointPriority;
00214
00216 typedef enum
00217 {
00218 DIRECTION_TOP_DOWN = 0,
00219 DIRECTION_BOTTOM_UP = 1
00220 }
00221 eProfileDirection;
00222
00226
00227
00234
00235 static OCamera *CreateCameraInterface(eCameraType eCam);
00242 virtual int Destroy() = 0;
00244
00245
00246
00247
00251
00252
00281 virtual int Open(int dFrameBufferSize = 4096*256, int dMaxBuffers = -1) = 0;
00292 virtual int Close() = 0;
00293
00311 virtual int GetImage(OCameraImage *pImage) = 0;
00321 virtual int ReleaseImage(OCameraImage *pImage) = 0;
00330 virtual int GetMaxImageCount() = 0;
00339 virtual int GetImageCount() = 0;
00340
00398 virtual int SetAcquisitionMode(eAcqMode eAcq) = 0;
00399
00409 virtual int SetTriggerSource(eTrigSource eTrig,
00410 eTrigPolarity ePol = TRIG_POL_ACTIVE_HIGH) = 0;
00411
00418 virtual int SetIlluminationMode(eIllMode eIll) = 0;
00419
00426 virtual int SetIlluminationModeExternal(eIllModeExt eIll) = 0;
00427
00437 virtual int SetIlluminationTiming(int dDelay, int dPeriod) = 0;
00438
00447 virtual int SwitchIllumination(bool bOn) = 0;
00448
00458 virtual int SetShutterTime(int dShutter) = 0;
00459
00473 virtual int SetCameraWindow(int dX0, int dY0, int dWidth, int dHeight) = 0;
00474
00486 virtual int SetFrameRate(int dFps) = 0;
00499 virtual int SetFrameRate(float fFps) = 0;
00500
00508 virtual int SetTriggerDelay(int dDelay) = 0;
00509
00520 virtual int SetGain(int dFactor) = 0;
00521
00530 virtual int SetReadTimeout(int dTimeout) = 0;
00531
00538 virtual int GetDriverFileDescriptor() = 0;
00539
00549 virtual int SetCircularOverwrite(bool bOverwrite) = 0;
00550
00551
00561 virtual int SetJPEG(bool bEnable, eJPEGQuality eQuality = JPEG_QUALITY_MEDIUM) = 0;
00562
00569 virtual int SetFrequency(eFrequency eFrequ) = 0;
00570
00579 virtual int GetImage2Buffer(OCameraImage *pImage) = 0;
00580
00593 virtual int ReadImageRAM(void *pDest, unsigned long ulAddr, unsigned long ulLen) = 0;
00606 virtual int WriteImageRAM(void *pSrc, unsigned long ulAddr, unsigned long ulLen) = 0;
00612 virtual int InitImageRAM(void) = 0;
00618 virtual int DisableImageRAM(void) = 0;
00625 virtual int GetImageToImageRAM(unsigned long ulAddr) = 0;
00626
00628 virtual int Diag() = 0;
00629
00630
00639 virtual int SequenceInit(OCameraSequenceStorage &oStore) = 0;
00640
00655 virtual int SequenceStart(long long dt, long long Z, bool bPrePost, bool bStartStop) = 0;
00656
00658 virtual int SequenceTrigger() = 0;
00659
00661 virtual int SequenceWaitFinish() = 0;
00662
00673 virtual int SequenceIsFinished() = 0;
00674
00682 virtual int SequenceGetResult(OCameraSequence &oSeq) = 0;
00683
00685 virtual int SequenceAbort() = 0;
00686
00688 virtual int SequenceCleanup() = 0;
00689
00697 virtual int ResetSequenceCounter() = 0;
00698
00713 virtual int PurgeImages() = 0;
00714
00725 virtual int CalibrateSensor() = 0;
00726
00741 virtual int SetSensorRegister(const char *pName, unsigned long nValue) = 0;
00742
00758 virtual int GetSensorRegister(const char *pName, unsigned long *pValue) = 0;
00759
00766 virtual char** GetSensorRegisterNames() = 0;
00767
00783 virtual int TriggerImage() = 0;
00784
00794 virtual int TriggerImageAbort() = 0;
00795
00840 virtual int SetupLaserProfiling(bool bEnable,
00841 int dX0, int dY0, int dWidth, int dHeight,
00842 ePointPriority ePrio, eProfileDirection eDir,
00843 int dThreshMin, int dThreshMax,
00844 int dAreaMin, int dAreaMax) = 0;
00845
00846
00873 virtual int SetHardwareApplet(bool bEnable, unsigned long nMaxSize) = 0;
00874
00875
00881 virtual int SetMedian(bool bEnable) = 0;
00882
00883
00908 virtual int SetTriggerWindow(int dX0, int dY0,
00909 int dWidth, int dHeight,
00910 int dThreshMin, int dThreshMax) = 0;
00911
00912
00923 virtual int WaitForNImages(int nImages) = 0;
00924
00926
00927 };
00928
00929
00930
00931
00935 class OCameraTools
00936 {
00937 public:
00938
00939 typedef enum
00940 {
00941 BAYER_PATTERN_GRGR = 1,
00942 BAYER_PATTERN_BGBG = 2,
00943 BAYER_PATTERN_RGRG = 3,
00944 BAYER_PATTERN_GBGB = 4
00945 }
00946 eBayerPattern;
00947
00948 public:
00956 static void Bayer2RGB(unsigned char *bayer, unsigned char *rgb,
00957 int width, int height,
00958 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
00959
00979 static void Bayer2RGBWhiteBalance(unsigned char *bayer, unsigned char *rgb,
00980 int width, int height,
00981 int red, int green, int blue,
00982 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
00983
01002 static int Bayer2RGBBuiltIn(unsigned char *bayer, unsigned char *rgb,
01003 int width, int height,
01004 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
01005
01022 static int GetWhiteBalanceFactors(int *red, int *green, int *blue);
01023
01034 static int StoreWhiteBalanceFactors(int red, int green, int blue);
01035 };
01036
01037
01038
01039
01056 class OCameraInputs
01057 {
01058 public:
01059
01061 typedef enum
01062 {
01063 INPUT_I0 = 1,
01064 INPUT_I1 = 2,
01065 INPUT_I0_RE = 4,
01066 INPUT_I0_FE = 8,
01067 INPUT_I1_RE = 16,
01068 INPUT_I1_FE = 32,
01069 OVERLOAD = 64,
01070
01071 INPUT_ALL = INPUT_I0 | INPUT_I1
01072 }
01073 t_enCameraInput;
01074
01075
01077 static OCameraInputs *poCreateInterface();
01084 virtual void Destroy() = 0;
01085
01094 virtual int iOpen() = 0;
01096 virtual int iClose() = 0;
01097
01109 virtual int iGetInputs() = 0;
01110
01119 virtual int iGetInput(t_enCameraInput enIn) = 0;
01120
01129 virtual int iSetTimeout(int iTimeout) = 0;
01130
01141 virtual int iWaitForInput(t_enCameraInput enIn, int iState) = 0;
01142
01158 virtual int iWaitForInputs(int iMask, int iState) = 0;
01159
01168 virtual int iWaitForInputChange(t_enCameraInput enIn) = 0;
01169
01179 virtual int iWaitForInputsChange(int iMask) = 0;
01180
01188 virtual int iClearEdges(int iMask) = 0;
01189
01194 virtual int GetDriverFileDescriptor() = 0;
01195 };
01196
01197
01198
01199
01216 class OCameraOutputs
01217 {
01218 public:
01219
01221 typedef enum
01222 {
01223 OUTPUT_O0 = 1,
01224 OUTPUT_O1 = 2,
01225 OUTPUT_O2 = 4,
01226 OUTPUT_O3 = 8,
01227
01228 OUTPUT_OVERLOAD_UNLOCK = 16,
01229
01230 OUTPUT_ALL = OUTPUT_O0 | OUTPUT_O1 | OUTPUT_O2 | OUTPUT_O3
01231 }
01232 t_enCameraOutput;
01233
01234
01238 static OCameraOutputs *poCreateInterface();
01246 virtual void Destroy() = 0;
01247
01257 virtual int iOpen() = 0;
01261 virtual int iClose() = 0;
01262
01271 virtual int iGetOutputs() = 0;
01272
01281 virtual int iGetOutput(t_enCameraOutput enOut) = 0;
01282
01293 virtual int iSetOutputs(int iMask, int iState) = 0;
01294
01301 virtual int iSetOutput(t_enCameraOutput enOut, int iState) = 0;
01302
01309 virtual int iToggleOutputs(int iMask) = 0;
01310
01316 virtual int iToggleOutput(t_enCameraOutput enOut) = 0;
01317
01318 };
01319
01320
01321
01322
01340 class OCameraLEDs
01341 {
01342 public:
01343
01345 typedef enum
01346 {
01347 LED_0_RED = 0x01,
01348 LED_0_GREEN = 0x02,
01349 LED_1_RED = 0x04,
01350 LED_1_GREEN = 0x08,
01351 LED_2_RED = 0x10,
01352 LED_2_YELLOW = 0x20,
01353 LED_3_RED = 0x40,
01354 LED_3_YELLOW = 0x80,
01355
01356 LED_ALL_RED = LED_0_RED | LED_1_RED | LED_2_RED | LED_3_RED,
01357 LED_ALL_GREEN = LED_0_GREEN | LED_1_GREEN,
01358 LED_ALL_YELLOW = LED_2_YELLOW | LED_3_YELLOW,
01359 LED_ALL = LED_ALL_RED | LED_ALL_GREEN | LED_ALL_YELLOW
01360 }
01361 t_enCameraLED;
01362
01363
01367 static OCameraLEDs *poCreateInterface();
01375 virtual void Destroy() = 0;
01376
01386 virtual int iOpen() = 0;
01390 virtual int iClose() = 0;
01391
01400 virtual int iGetLEDs() = 0;
01401
01410 virtual int iGetLED(t_enCameraLED enLED) = 0;
01411
01420 virtual int iSetLEDs(int iMask, int iState) = 0;
01421
01428 virtual int iSetLED(t_enCameraLED enLED, int iState) = 0;
01429
01436 virtual int iToggleLEDs(int iMask) = 0;
01437
01443 virtual int iToggleLED(t_enCameraLED enLED) = 0;
01444 };
01445
01446 #endif // __OCAMERA_H__