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
00913
00914 };
00915
00916
00917
00918
00922 class OCameraTools
00923 {
00924 public:
00925
00926 typedef enum
00927 {
00928 BAYER_PATTERN_GRGR = 1,
00929 BAYER_PATTERN_BGBG = 2,
00930 BAYER_PATTERN_RGRG = 3,
00931 BAYER_PATTERN_GBGB = 4
00932 }
00933 eBayerPattern;
00934
00935 public:
00943 static void Bayer2RGB(unsigned char *bayer, unsigned char *rgb,
00944 int width, int height,
00945 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
00946
00966 static void Bayer2RGBWhiteBalance(unsigned char *bayer, unsigned char *rgb,
00967 int width, int height,
00968 int red, int green, int blue,
00969 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
00970
00989 static int Bayer2RGBBuiltIn(unsigned char *bayer, unsigned char *rgb,
00990 int width, int height,
00991 eBayerPattern ePattern = BAYER_PATTERN_GRGR);
00992
01009 static int GetWhiteBalanceFactors(int *red, int *green, int *blue);
01010
01021 static int StoreWhiteBalanceFactors(int red, int green, int blue);
01022 };
01023
01024
01025
01026
01043 class OCameraInputs
01044 {
01045 public:
01046
01048 typedef enum
01049 {
01050 INPUT_I0 = 1,
01051 INPUT_I1 = 2,
01052 INPUT_I0_RE = 4,
01053 INPUT_I0_FE = 8,
01054 INPUT_I1_RE = 16,
01055 INPUT_I1_FE = 32,
01056 OVERLOAD = 64,
01057
01058 INPUT_ALL = INPUT_I0 | INPUT_I1
01059 }
01060 t_enCameraInput;
01061
01062
01064 static OCameraInputs *poCreateInterface();
01071 virtual void Destroy() = 0;
01072
01081 virtual int iOpen() = 0;
01083 virtual int iClose() = 0;
01084
01096 virtual int iGetInputs() = 0;
01097
01106 virtual int iGetInput(t_enCameraInput enIn) = 0;
01107
01116 virtual int iSetTimeout(int iTimeout) = 0;
01117
01128 virtual int iWaitForInput(t_enCameraInput enIn, int iState) = 0;
01129
01145 virtual int iWaitForInputs(int iMask, int iState) = 0;
01146
01155 virtual int iWaitForInputChange(t_enCameraInput enIn) = 0;
01156
01166 virtual int iWaitForInputsChange(int iMask) = 0;
01167
01175 virtual int iClearEdges(int iMask) = 0;
01176
01181 virtual int GetDriverFileDescriptor() = 0;
01182 };
01183
01184
01185
01186
01203 class OCameraOutputs
01204 {
01205 public:
01206
01208 typedef enum
01209 {
01210 OUTPUT_O0 = 1,
01211 OUTPUT_O1 = 2,
01212 OUTPUT_O2 = 4,
01213 OUTPUT_O3 = 8,
01214
01215 OUTPUT_OVERLOAD_UNLOCK = 16,
01216
01217 OUTPUT_ALL = OUTPUT_O0 | OUTPUT_O1 | OUTPUT_O2 | OUTPUT_O3
01218 }
01219 t_enCameraOutput;
01220
01221
01225 static OCameraOutputs *poCreateInterface();
01233 virtual void Destroy() = 0;
01234
01244 virtual int iOpen() = 0;
01248 virtual int iClose() = 0;
01249
01258 virtual int iGetOutputs() = 0;
01259
01268 virtual int iGetOutput(t_enCameraOutput enOut) = 0;
01269
01280 virtual int iSetOutputs(int iMask, int iState) = 0;
01281
01288 virtual int iSetOutput(t_enCameraOutput enOut, int iState) = 0;
01289
01296 virtual int iToggleOutputs(int iMask) = 0;
01297
01303 virtual int iToggleOutput(t_enCameraOutput enOut) = 0;
01304
01305 };
01306
01307
01308
01309
01327 class OCameraLEDs
01328 {
01329 public:
01330
01332 typedef enum
01333 {
01334 LED_0_RED = 0x01,
01335 LED_0_GREEN = 0x02,
01336 LED_1_RED = 0x04,
01337 LED_1_GREEN = 0x08,
01338 LED_2_RED = 0x10,
01339 LED_2_YELLOW = 0x20,
01340 LED_3_RED = 0x40,
01341 LED_3_YELLOW = 0x80,
01342
01343 LED_ALL_RED = LED_0_RED | LED_1_RED | LED_2_RED | LED_3_RED,
01344 LED_ALL_GREEN = LED_0_GREEN | LED_1_GREEN,
01345 LED_ALL_YELLOW = LED_2_YELLOW | LED_3_YELLOW,
01346 LED_ALL = LED_ALL_RED | LED_ALL_GREEN | LED_ALL_YELLOW
01347 }
01348 t_enCameraLED;
01349
01350
01354 static OCameraLEDs *poCreateInterface();
01362 virtual void Destroy() = 0;
01363
01373 virtual int iOpen() = 0;
01377 virtual int iClose() = 0;
01378
01387 virtual int iGetLEDs() = 0;
01388
01397 virtual int iGetLED(t_enCameraLED enLED) = 0;
01398
01407 virtual int iSetLEDs(int iMask, int iState) = 0;
01408
01415 virtual int iSetLED(t_enCameraLED enLED, int iState) = 0;
01416
01423 virtual int iToggleLEDs(int iMask) = 0;
01424
01430 virtual int iToggleLED(t_enCameraLED enLED) = 0;
01431 };
01432
01433 #endif // __OCAMERA_H__