OCamera.h

Go to the documentation of this file.
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 //****************************************************************************
00094 //                                                                     OCamera
00095 //****************************************************************************
00113 class OCamera
00114 {
00115  public:
00116 
00117   // enums
00118 
00120   typedef enum
00121     {
00122       CAM_TYPE_MT9V403   = 3,    
00123       CAM_TYPE_GENERIC   = 4,    
00124       CAM_TYPE_IBIS1300  = 5,    
00125       CAM_TYPE_MT9V022   = 6,    
00126       CAM_TYPE_MT9V023   = 7,    
00127     }
00128   eCameraType;
00129 
00131   typedef enum
00132     {
00133       ACQ_MODE_STOP                = 1,   
00134       ACQ_MODE_SINGLE_SHOT         = 2,   
00135       ACQ_MODE_FREE_RUN            = 3,   
00136       ACQ_MODE_SELECT_SHOT         = 4,   
00137       ACQ_MODE_FPGA_SINGLE_SHOT    = 5,   
00138       ACQ_MODE_FPGA_CONTINUOUS     = 6,   
00139       ACQ_MODE_FREE_RUN_SLAVE      = 8,   
00140       ACQ_MODE_SEQUENCE_MASTER     = 9,   
00141       ACQ_MODE_SEQUENCE_SLAVE      = 10,  
00142       ACQ_MODE_FREE_RUN_SLAVE_STOP = 11,  
00143       ACQ_MODE_Q3D_SNAPSHOT        = 12   
00144     }
00145   eAcqMode;
00146 
00148   typedef enum
00149     {
00150       TRIG_SRC_SOFTWARE        = 1,  
00151       TRIG_SRC_EXTERNAL_E0     = 2,  
00152       TRIG_SRC_EXTERNAL_E1     = 3   
00153     }
00154   eTrigSource;
00155 
00157   typedef enum
00158     {
00159       TRIG_POL_ACTIVE_HIGH  = 1,  
00160       TRIG_POL_ACTIVE_LOW   = 2   
00161     }
00162   eTrigPolarity;
00163 
00165   typedef enum
00166     {
00167       ILL_MODE_OFF     = 1,  
00168       ILL_MODE_NORMAL  = 2,  
00169       ILL_MODE_PULSED  = 3   
00170     }
00171   eIllMode;
00172 
00174   typedef enum
00175     {
00176       ILL_MODE_EXT_OFF         = 0,  
00177       ILL_MODE_EXT_ON_POSITIVE = 1,  
00178       ILL_MODE_EXT_ON_NEGATIVE = 2   
00179     }
00180   eIllModeExt;
00181 
00188   typedef enum
00189     {
00190       FREQU_20MHz = 0,              
00191       FREQU_40MHz = 1,              
00192       FREQU_50MHz = 2,              
00193       FREQU_60MHz = 3               
00194     }
00195   eFrequency;
00196 
00198   typedef enum
00199     {
00200       JPEG_QUALITY_LOW       = 0,   
00201       JPEG_QUALITY_MEDIUM    = 1,   
00202       JPEG_QUALITY_GOOD      = 2,   
00203       JPEG_QUALITY_EXCELLENT = 3    
00204     }
00205   eJPEGQuality;
00206 
00208   typedef enum
00209     {
00210       PRIO_FIRST_POINT   = 0,    
00211       PRIO_LAST_POINT    = 1,    
00212       PRIO_LARGEST_FIRST = 2,    
00215       PRIO_LARGEST_LAST  = 3     
00218     }
00219   ePointPriority;
00220 
00222   typedef enum
00223     {
00224       DIRECTION_TOP_DOWN  = 0,   
00225       DIRECTION_BOTTOM_UP = 1    
00226     }
00227   eProfileDirection;
00228 
00230   typedef enum
00231     {
00232       LASER_OUTPUT_16_4   = 0x04,   
00233       LASER_OUTPUT_8_0    = 0x10,   
00234       LASER_OUTPUT_8_1    = 0x11,   
00235       LASER_OUTPUT_8_2    = 0x12,   
00236       LASER_OUTPUT_8_3    = 0x13,   
00237       LASER_OUTPUT_8_4    = 0x14    
00238     }
00239   eLaserOutputFormat;
00240 
00242   typedef enum
00243     {
00244       FILTER_OFF              = 0,  
00245       FILTER_BINARIZE_ONLY    = 1,  
00246       FILTER_MEDIAN           = 2,  
00247       FILTER_MEAN             = 3,  
00248       FILTER_SNN              = 4,  
00249       FILTER_SOBEL            = 5,  
00250       FILTER_RESERVED_1       = 6,  
00251       FILTER_RESERVED_2       = 7,  
00252       FILTER_RESERVED_3       = 8   
00253     }
00254   eFilterType;
00255 
00257   typedef enum
00258     {
00259       BAYER_OUTPUT_RAW = 0,  
00260       BAYER_OUTPUT_H   = 1,  
00261       BAYER_OUTPUT_S   = 2,  
00262       BAYER_OUTPUT_V   = 3,  
00263       BAYER_OUTPUT_I   = 4,  
00264       BAYER_OUTPUT_R   = 5,  
00265       BAYER_OUTPUT_G   = 6,  
00266       BAYER_OUTPUT_B   = 7   
00267     }
00268   eBayer2XType;
00269 
00271   typedef enum
00272     {
00273       BAYER_PATTERN_GRGR = 1,    
00274       BAYER_PATTERN_BGBG = 2,    
00275       BAYER_PATTERN_RGRG = 3,    
00276       BAYER_PATTERN_GBGB = 4     
00277     }
00278   eBayerPattern;
00279 
00281   typedef enum
00282     {
00283       APPLET_IN16_OUT32_INT = 0, 
00284       APPLET_IN8_OUT32_INT  = 1, 
00285       APPLET_IN16_OUT16     = 2, 
00286       APPLET_IN8_OUT16      = 3  
00287     }
00288   eAppletType;
00289   
00291   typedef enum
00292     {
00293       CORRECTION_REPLACE    = 0,  
00294       CORRECTION_MASK_AND   = 1,  
00295       CORRECTION_MASK_OR    = 2,  
00296       CORRECTION_RESERVED_1 = 3   
00297     }
00298   eCorrectionType;
00299 
00301   typedef enum
00302     {
00303       SPLIT_OFF        = 0,  
00304       SPLIT_RAW        = 1,  
00305       SPLIT_PROCESSED  = 2,  
00306     }
00307   eSplitType;
00308 
00310   typedef struct sFilterParam
00311   {
00312     unsigned long nNumParam; 
00313     unsigned long nParam1;   
00314     unsigned long nParam2;   
00315   } sFilterParamType;
00316 
00318   typedef struct sBinarizationParam
00319   {
00320     bool bInvert;                
00321     unsigned char nNumThreshold; 
00322     unsigned char nThreshold1;   
00323     unsigned char nThreshold2;   
00324   } sBinarizationParamType;
00325 
00327   typedef struct sCalibrateSensorParam
00328   {
00329     unsigned long nNumParam;
00330     unsigned long nParam1;
00331     unsigned long nParam2;
00332   } sCalibrateSensorParamType;
00333 
00334 
00338 
00339 
00358   // object creation/deletion
00359   static OCamera *CreateCameraInterface(eCameraType eCam);
00366   virtual int Destroy() = 0;
00368 
00369   // -----------------------------------------------------------------
00370   // operations
00371   // -----------------------------------------------------------------
00375 
00376   // open and close the camera interface
00410   virtual int Open(int dFrameBufferSize = 4096*256, int dMaxBuffers = -1) = 0;
00411 
00422   virtual int Close() = 0;
00423 
00441   virtual int GetImage(OCameraImage *pImage) = 0;
00442 
00452   virtual int ReleaseImage(OCameraImage *pImage) = 0;
00453 
00467   virtual int GetNImages(OCameraImage **pImages, int dMaxImages) = 0;
00468 
00478   virtual int ReleaseNImages(OCameraImage **pImages, int dImages) = 0;
00479 
00488   virtual int GetMaxImageCount() = 0;
00489 
00498   virtual int GetImageCount() = 0;
00499 
00559   virtual int SetAcquisitionMode(eAcqMode eAcq) = 0;
00560 
00570   virtual int SetTriggerSource(eTrigSource eTrig,
00571                                eTrigPolarity ePol = TRIG_POL_ACTIVE_HIGH) = 0;
00572 
00579   virtual int SetIlluminationMode(eIllMode eIll) = 0;
00580 
00587   virtual int SetIlluminationModeExternal(eIllModeExt eIll) = 0;
00588 
00598   virtual int SetIlluminationTiming(int dDelay, int dPeriod) = 0;
00599 
00608   virtual int SwitchIllumination(bool bOn) = 0;
00609 
00619   virtual int SetShutterTime(int dShutter) = 0;
00620 
00630   virtual int GetShutterTime(void) = 0;
00631 
00645   virtual int SetCameraWindow(int dX0, int dY0, int dWidth, int dHeight) = 0;
00646 
00658   virtual int SetFrameRate(int dFps) = 0;
00659 
00672   virtual int SetFrameRate(float fFps) = 0;
00673 
00681   virtual int SetTriggerDelay(int dDelay) = 0;
00682 
00693   virtual int SetGain(int dFactor) = 0;
00694 
00707   virtual int InitColor() = 0;
00708 
00721   virtual int SetReadTimeout(int dTimeout) = 0;
00722 
00729   virtual int GetDriverFileDescriptor() = 0;
00730 
00740   virtual int SetCircularOverwrite(bool bOverwrite) = 0;
00741 
00761   virtual int SetJPEG(bool bEnable, eJPEGQuality eQuality = JPEG_QUALITY_MEDIUM,
00762                       bool bByteStuffEnable = false, eBayerPattern ePattern = BAYER_PATTERN_GRGR,
00763                       bool bForceGreyscale = false) = 0;
00764 
00779   virtual int SetFrequency(eFrequency eFrequ) = 0;
00780 
00789   virtual int GetImage2Buffer(OCameraImage *pImage) = 0;
00790 
00805   virtual int ReadImageRAM(void *pDest, unsigned long ulAddr, unsigned long ulLen) = 0;
00806 
00821   virtual int WriteImageRAM(void *pSrc, unsigned long ulAddr, unsigned long ulLen) = 0;
00822 
00840   virtual int ReadImageRAMReducedData(void *pDest, unsigned long ulAddr, unsigned long ulLen,
00841                                       unsigned long *ulRetLen) = 0;
00842 
00856   virtual int ImageRAMToImageRAM(unsigned long ulSrcAddr, unsigned long ulSrcLen,
00857                                  unsigned long ulDestAddr, unsigned long ulDestLen) = 0;
00858 
00867   virtual int InitImageRAM(void) = 0;
00874   virtual int DisableImageRAM(void) = 0;
00883   virtual int GetImageToImageRAM(unsigned long ulAddr) = 0;
00884 
00886   virtual int Diag() = 0;
00887 
00888   // Triggered Images Sequence Acquisition
00897   virtual int SequenceInit(OCameraSequenceStorage &oStore) = 0;
00898 
00913   virtual int SequenceStart(long long dt, long long Z, bool bPrePost, bool bStartStop) = 0;
00914 
00916   virtual int SequenceTrigger() = 0;
00917 
00919   virtual int SequenceWaitFinish() = 0;
00920 
00931   virtual int SequenceIsFinished() = 0;
00932 
00940   virtual int SequenceGetResult(OCameraSequence &oSeq) = 0;
00941 
00943   virtual int SequenceAbort() = 0;
00944 
00946   virtual int SequenceCleanup() = 0;
00947 
00955  virtual int ResetSequenceCounter() = 0;
00956 
00971   virtual int PurgeImages() = 0;
00972 
00983   virtual int CalibrateSensor(sCalibrateSensorParamType *pParam = 0) = 0;
00984 
00999   virtual int SetSensorRegister(const char *pName, unsigned long nValue) = 0;
01000 
01016   virtual int GetSensorRegister(const char *pName, unsigned long *pValue) = 0;
01017 
01024   virtual char** GetSensorRegisterNames() = 0;
01025 
01041   virtual int TriggerImage() = 0;
01042 
01052   virtual int TriggerImageAbort() = 0;
01053 
01108   virtual int SetupLaserProfiling(bool bEnable,
01109                                   int dX0, int dY0, int dWidth, int dHeight,
01110                                   ePointPriority ePrio, eProfileDirection eDir,
01111                                   int dThreshMin, int dThreshMax,
01112                                   int dAreaMin, int dAreaMax, eLaserOutputFormat dSubRes = LASER_OUTPUT_16_4,
01113                                   unsigned char *pRefData = 0) = 0;
01114 
01115   // Generic Hardware Applet interface
01143   virtual int SetHardwareApplet(bool bEnable, unsigned long nMaxSize, eAppletType eApplet = APPLET_IN16_OUT32_INT) = 0;
01144 
01145   // Median filter interface
01165   virtual int SetMedian(bool bEnable) = 0;
01166 
01185   virtual int SetFilter(eFilterType eFilter, sFilterParamType *pParam = 0) = 0;
01186 
01200   virtual int SetBinarization(bool bEnable, sBinarizationParamType *pParam = 0) = 0;
01201 
01213   virtual int SetBayer2X(eBayer2XType eBayer2xOutput, eBayerPattern ePattern) = 0;
01214 
01229   virtual int SetWhiteBalance(eBayerPattern ePattern, unsigned char* pLut = 0) = 0;
01230 
01242   virtual int SetImageRAMPictureSize(int dWidth, int dHeight) = 0;
01243 
01244   // FPGA-based triggering
01269   virtual int SetTriggerWindow(int dX0, int dY0,
01270                                int dWidth, int dHeight,
01271                                int dThreshMin, int dThreshMax) = 0;
01272 
01273   // Wait until N images available
01284   virtual int WaitForNImages(int nImages) = 0;
01285 
01286 
01305   virtual int SetupImageCorrection(bool bEnable, eCorrectionType eType, unsigned long ulStartAddr, unsigned long ulSize, unsigned long ulImages) = 0;
01306 
01321   virtual int SetupImageSplitting(eSplitType eType, unsigned long ulDestAddr, unsigned long ulSize) = 0;
01322 
01323 
01325 
01326 };
01327 
01328 //****************************************************************************
01329 //                                                                OCameraTools
01330 //****************************************************************************
01334 class OCameraTools
01335 {
01336  public:
01337 
01338   typedef enum
01339     {
01340       BAYER_PATTERN_GRGR = 1,    
01341       BAYER_PATTERN_BGBG = 2,    
01342       BAYER_PATTERN_RGRG = 3,    
01343       BAYER_PATTERN_GBGB = 4     
01344     }
01345   eBayerPattern;
01346 
01347  public:
01355   static void Bayer2RGB(unsigned char *bayer, unsigned char *rgb,
01356                         int width, int height,
01357                         eBayerPattern ePattern = BAYER_PATTERN_GRGR);
01358 
01378   static void Bayer2RGBWhiteBalance(unsigned char *bayer, unsigned char *rgb,
01379                                     int width, int height,
01380                                     int red, int green, int blue,
01381                                     eBayerPattern ePattern = BAYER_PATTERN_GRGR);
01382 
01401   static int Bayer2RGBBuiltIn(unsigned char *bayer, unsigned char *rgb,
01402                               int width, int height,
01403                               eBayerPattern ePattern = BAYER_PATTERN_GRGR);
01404 
01421   static int GetWhiteBalanceFactors(int *red, int *green, int *blue);
01422 
01433   static int StoreWhiteBalanceFactors(int red, int green, int blue);
01434 
01443   static int SetupHardwareWhitebalancingFactors(unsigned char WBtable[768]);
01444 
01445 };
01446 
01447 //****************************************************************************
01448 //                                                               OCameraInputs
01449 //****************************************************************************
01466 class OCameraInputs
01467 {
01468  public:
01469 
01471   typedef enum
01472     {
01473       INPUT_I0    = 1,    
01474       INPUT_I1    = 2,    
01475       INPUT_I0_RE = 4,    
01476       INPUT_I0_FE = 8,    
01477       INPUT_I1_RE = 16,   
01478       INPUT_I1_FE = 32,   
01479       OVERLOAD    = 64,   
01480 
01481       INPUT_ALL = INPUT_I0 | INPUT_I1  
01482     }
01483   t_enCameraInput;
01484 
01485   // object creation/deletion
01487   static OCameraInputs *poCreateInterface();
01494   virtual void Destroy() = 0;
01495 
01504   virtual int iOpen() = 0;
01506   virtual int iClose() = 0;
01507 
01519   virtual int iGetInputs() = 0;
01520 
01529   virtual int iGetInput(t_enCameraInput enIn) = 0;
01530 
01539   virtual int iSetTimeout(int iTimeout) = 0;
01540 
01551   virtual int iWaitForInput(t_enCameraInput enIn, int iState) = 0;
01552 
01568   virtual int iWaitForInputs(int iMask, int iState) = 0;
01569 
01578   virtual int iWaitForInputChange(t_enCameraInput enIn) = 0;
01579 
01589   virtual int iWaitForInputsChange(int iMask) = 0;
01590 
01598   virtual int iClearEdges(int iMask) = 0;
01599 
01604   virtual int GetDriverFileDescriptor() = 0;
01605 };
01606 
01607 //****************************************************************************
01608 //                                                              OCameraOutputs
01609 //****************************************************************************
01626 class OCameraOutputs
01627 {
01628  public:
01629 
01631   typedef enum
01632     {
01633       OUTPUT_O0  = 1,    
01634       OUTPUT_O1  = 2,    
01635       OUTPUT_O2  = 4,    
01636       OUTPUT_O3  = 8,    
01637 
01638       OUTPUT_OVERLOAD_UNLOCK = 16, 
01639 
01640       OUTPUT_ALL = OUTPUT_O0 | OUTPUT_O1 | OUTPUT_O2 | OUTPUT_O3  
01641     }
01642   t_enCameraOutput;
01643 
01644   // object creation/deletion
01648   static OCameraOutputs *poCreateInterface();
01656   virtual void Destroy() = 0;
01657 
01667   virtual int iOpen() = 0;
01671   virtual int iClose() = 0;
01672 
01681   virtual int iGetOutputs() = 0;
01682 
01691   virtual int iGetOutput(t_enCameraOutput enOut) = 0;
01692 
01703   virtual int iSetOutputs(int iMask, int iState) = 0;
01704 
01711   virtual int iSetOutput(t_enCameraOutput enOut, int iState) = 0;
01712 
01719   virtual int iToggleOutputs(int iMask) = 0;
01720 
01726   virtual int iToggleOutput(t_enCameraOutput enOut) = 0;
01727 
01728 };
01729 
01730 //****************************************************************************
01731 //                                                                 OCameraLEDs
01732 //****************************************************************************
01750 class OCameraLEDs
01751 {
01752  public:
01753 
01755   typedef enum
01756     {
01757       LED_0_RED    = 0x01,    
01758       LED_0_GREEN  = 0x02,    
01759       LED_1_RED    = 0x04,    
01760       LED_1_GREEN  = 0x08,    
01761       LED_2_RED    = 0x10,    
01762       LED_2_YELLOW = 0x20,    
01763       LED_3_RED    = 0x40,    
01764       LED_3_YELLOW = 0x80,    
01765 
01766       LED_ALL_RED    = LED_0_RED    | LED_1_RED | LED_2_RED | LED_3_RED,  
01767       LED_ALL_GREEN  = LED_0_GREEN  | LED_1_GREEN,                        
01768       LED_ALL_YELLOW = LED_2_YELLOW | LED_3_YELLOW,                       
01769       LED_ALL        = LED_ALL_RED  | LED_ALL_GREEN | LED_ALL_YELLOW      
01770     }
01771   t_enCameraLED;
01772 
01773   // object creation/deletion
01777   static OCameraLEDs *poCreateInterface();
01785   virtual void Destroy() = 0;
01786 
01796   virtual int iOpen() = 0;
01800   virtual int iClose() = 0;
01801 
01810   virtual int iGetLEDs() = 0;
01811 
01820   virtual int iGetLED(t_enCameraLED enLED) = 0;
01821 
01830   virtual int iSetLEDs(int iMask, int iState) = 0;
01831 
01838   virtual int iSetLED(t_enCameraLED enLED, int iState) = 0;
01839 
01846   virtual int iToggleLEDs(int iMask) = 0;
01847 
01853   virtual int iToggleLED(t_enCameraLED enLED) = 0;
01854 };
01855 
01856 #endif // __OCAMERA_H__

Generated on Wed Jul 22 08:34:30 2009 for Festo Camera API by  doxygen 1.5.3