latest version v1.9 - last update 10 Apr 2010 |
00001 /* 00002 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 00003 * Lehrstuhl fuer Technische Informatik, RWTH-Aachen, Germany 00004 * 00005 * This file is part of the LTI-Computer Vision Library (LTI-Lib) 00006 * 00007 * The LTI-Lib is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public License (LGPL) 00009 * as published by the Free Software Foundation; either version 2.1 of 00010 * the License, or (at your option) any later version. 00011 * 00012 * The LTI-Lib is distributed in the hope that it will be 00013 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 00014 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with the LTI-Lib; see the file LICENSE. If 00019 * not, write to the Free Software Foundation, Inc., 59 Temple Place - 00020 * Suite 330, Boston, MA 02111-1307, USA. 00021 */ 00022 00023 00024 /*---------------------------------------------------------------- 00025 * project ....: LTI Digital Image/Signal Processing Library 00026 * file .......: ltiMicroEnablePulnix.h 00027 * authors ....: Pablo Alvarado 00028 * organization: LTI, RWTH Aachen 00029 * creation ...: 13.08.99 00030 * revisions ..: $Id: ltiMicroEnablePulnix.h,v 1.7 2006/02/08 12:06:52 ltilib Exp $ 00031 */ 00032 00033 #ifndef _LTI_MICRO_ENABLE_H_ 00034 #define _LTI_MICRO_ENABLE_H_ 00035 00036 00037 #include "ltiFrameGrabber.h" 00038 #include "ltiSemaphore.h" 00039 #include "ltiSerial.h" 00040 00041 #ifdef _USE_MICRO_ENABLE_FRAME_GRABBER 00042 00043 // ------- Silicon Software Includes ------- 00044 00045 #if __linux__ 00046 00047 // this is required by silicon software os_type.h file: 00048 #ifndef LINUX 00049 #define LINUX 00050 #endif 00051 00052 #endif 00053 00054 #include <menable.h> 00055 #include <fgrab.h> 00056 00057 // ---------------------------- 00058 00059 namespace lti { 00060 00061 /** 00062 * Silicon Software channel link frame grabber (Linux version!). 00063 * 00064 * class for grabbing frames from cameras and converting them to lti::image 00065 * format. 00066 * 00067 * Don't forget to uncomment the line 00068 * "#define _USE_MICRO_ENABLE_FRAME_GRABBER" in the file ltiHardwareConfig.h 00069 * before compiling! 00070 * 00071 * For Linux it is important to use the correct extra-path variables in 00072 * the Makefile. These variables point to the include files and 00073 * libraries required by the MicroEnable hardware. The variables are: 00074 * \code 00075 * EXTRAINCLUDEPATH = -I/usr/src/menable/include 00076 * EXTRALIBPATH = -L/usr/src/menable/lib 00077 * EXTRALIBS = -lpulnixchanneltmc6700 -lmenable 00078 * \endcode 00079 * 00080 * where you should replace <code>/usr/src/menable</code> with the correct 00081 * path to your MicroEnable directory. 00082 * 00083 * Errors: 00084 * The error 2080 usually means that the variable HAP_PATH has not been 00085 * set yet! 00086 * 00087 */ 00088 class microEnablePulnix : public frameGrabber { 00089 public: 00090 00091 class bankType; 00092 00093 /** 00094 * frameGrabber parameters class 00095 */ 00096 class parameters : public frameGrabber::parameters { 00097 friend class microEnablePulnix; 00098 public: 00099 /** 00100 * default constructor 00101 */ 00102 parameters(); 00103 00104 /** 00105 * copy constructor 00106 */ 00107 parameters( const parameters& other ); 00108 00109 /** 00110 * destructor 00111 */ 00112 ~parameters(); 00113 00114 /** 00115 * copy member 00116 */ 00117 parameters& copy( const parameters& other ); 00118 00119 /** 00120 * returns a pointer to a clone of the parameters. 00121 */ 00122 virtual functor::parameters* clone() const; 00123 00124 /** 00125 * returns the type name 00126 */ 00127 virtual const char* getTypeName() const; 00128 00129 /** 00130 * read the parameters from the given ioHandler 00131 * @param handler the ioHandler to be used 00132 * @param complete if true (the default) the enclosing begin/end will 00133 * be also written, otherwise only the data block will be written. 00134 * @return true if write was successful 00135 */ 00136 virtual bool write(ioHandler& handler,const bool complete=true) const; 00137 00138 /** 00139 * read the parameters from the given ioHandler 00140 * @param handler the ioHandler to be used 00141 * @param complete if true (the default) the enclosing begin/end will 00142 * be also written, otherwise only the data block will be written. 00143 * @return true if write was successful 00144 */ 00145 virtual bool read(ioHandler& handler,const bool complete=true); 00146 00147 00148 00149 # ifdef _LTI_MSC_6 00150 /** 00151 * this function is required by MSVC only, as a workaround for a 00152 * very awful bug, which exists since MSVC V.4.0, and still by 00153 * V.6.0 with all bugfixes (so called "service packs") remains 00154 * there... This method is also public due to another bug, so please 00155 * NEVER EVER call this method directly: use read() instead 00156 */ 00157 bool readMS(ioHandler& handler,const bool complete=true); 00158 00159 /** 00160 * this function is required by MSVC only, as a workaround for a 00161 * very awful bug, which exists since MSVC V.4.0, and still by 00162 * V.6.0 with all bugfixes (so called "service packs") remains 00163 * there... This method is also public due to another bug, so please 00164 * NEVER EVER call this method directly: use write() instead 00165 */ 00166 bool writeMS(ioHandler& handler,const bool complete=true) const; 00167 # endif 00168 00169 /** 00170 * read the parameters from the camera, 00171 * assuming that the serial port of the pulnix camera is 00172 * connected at the given serial port. This will take a while! 00173 * You can choose if you want to read all parameter sets or the 00174 * current bank only. 00175 * 00176 * To send the parameters to the camera use the method setParameters() 00177 * of the microEnablePulnix functor. 00178 * 00179 * @param serialPort the serial port used to communicate with 00180 * the camera. (Com1, Com2, ...) 00181 * @param allBanks if true, all parameter banks will be read. Otherwise 00182 * only the current bank will be read. 00183 * @return true if successful, false otherwise 00184 */ 00185 virtual bool download(const serial::parameters::ePortType& serialPort, 00186 const bool& allBanks = true); 00187 00188 00189 // ------------- The Parameters --------------- 00190 00191 /** 00192 * Which serial port should be used to communicate with the camera? 00193 */ 00194 serial::parameters::ePortType serialPort; 00195 00196 /** 00197 * The four parameter banks 00198 */ 00199 bankType* bank; 00200 00201 /** 00202 * The parameter-bank number to be used. 00203 * This must be a value between 0 and 3. Only the last two bits of 00204 * the given value will be considered. 00205 * Default value: 3 00206 */ 00207 int currentBank; 00208 00209 /** 00210 * Amount of memory in bytes to be allocated on the host to 00211 * communicate with the grabber (Default 8MB=8*1024*1024). 00212 * 00213 * This parameter is consider just once, at the initialization. 00214 * After that, it is not possible to change the buffer size. 00215 */ 00216 int bufferSize; 00217 00218 /** 00219 * dimensions of the grabbed window (default 640x480) 00220 */ 00221 point windowSize; 00222 00223 /** 00224 * offset of the grabbed window (default 104x40) 00225 */ 00226 point windowOffset; 00227 00228 /** 00229 * Possible shutter modes 00230 */ 00231 enum eShutterMode { 00232 SMUninitialized = -1, /**< uninitialized shutter mode */ 00233 DirectM, /**< Direct shutter specification for the manual mode. 00234 * The shutter value to be used is specified in the 00235 * parameter <code>shutterSpeed</code> 00236 */ 00237 DirectA, /**< Direct shutter specification for the asynchronous mode. 00238 * The shutter value to be used is specified in the 00239 * parameter <code>shutterSpeed</code> 00240 */ 00241 Manual, /**< Use one of the shutter values specified in the 00242 * manual shutter table. The entry in that table is 00243 * given in the parameter <code>shutterEntry</code>. 00244 */ 00245 Async, /**< Use one of the shutter values specified in the 00246 * async shutter table. The entry in that table is 00247 * given in the parameter <code>shutterEntry</code>. 00248 */ 00249 }; 00250 00251 /** 00252 * modes for edge enhancement 00253 */ 00254 enum eEdgeEnhancement { 00255 EEUninitialized=-1, /**< uninitialized 00256 */ 00257 Off=0x00, /**< No edge enhancement 00258 */ 00259 Horizontal=0x04, /**< Horizontal edge enhancement 00260 */ 00261 Vertical=0x08, /**< Vertical edge enhancement 00262 */ 00263 Both=0x0C /**< Horizontal and vertical edge enhancement 00264 */ 00265 }; 00266 00267 /** 00268 * white balance mode 00269 */ 00270 enum eWhiteBalanceType { 00271 WBUninitialized=-1, /**< uninitialized 00272 */ 00273 WBManual, /**< Manual mode. You need this mode to adjust the 00274 * blue and red gains. 00275 * In the Pulnix documentation, this mode is 00276 * refered as "External" mode 00277 */ 00278 WBAuto /**< Automatic White Balance. 00279 * In the Pulnix documentation, this mode is 00280 * refered as "Internal" mode 00281 */ 00282 }; 00283 00284 protected: 00285 00286 /** 00287 * send the parameters to the camera, 00288 * assuming that the serial port of the pulnix camera is 00289 * connected to the given serial port. This will upload only 00290 * those parameter that have changed! 00291 * You can choose if you want to send only the current bank (default) or 00292 * if you want to send all parameters banks. 00293 * @param serialPort the serial port used to communicate with 00294 * the camera. (Com1, Com2, ...) 00295 * @param allBanks if true, all parameters sets will be send to the 00296 * camera. If false, only the current bank will be send. 00297 * @param force if true, everything will be senden, ignoring the 00298 * content of the "camera shadow" 00299 * @return true if successful, false otherwise 00300 */ 00301 virtual bool upload(const serial::parameters::ePortType& serialPort, 00302 const bool allBanks = false, 00303 const bool force = false) const; 00304 00305 /** 00306 * dimensions of the grabbed window 00307 * 00308 * These are the real values in the camera/frame grabber, used 00309 * to detect if the table needs to be resend. 00310 */ 00311 static point camWindowSize; 00312 00313 /** 00314 * offset of the grabbed window 00315 * 00316 * These are the real values in the camera/frame grabber, used 00317 * to detect if the table needs to be resend. 00318 */ 00319 static point camWindowOffset; 00320 00321 /** 00322 * current bank in the camera 00323 */ 00324 static int camCurrentBank; 00325 }; 00326 00327 /** 00328 * The Pulnix Camera TMC6700 can handle up to four parameters sets. 00329 * This class provides the information for one bank. The parameter class 00330 * contains four of this banks. 00331 */ 00332 class bankType : public functor::parameters { 00333 public: 00334 /** 00335 * default constructor. 00336 */ 00337 bankType(); 00338 00339 /** 00340 * copy constructor. 00341 * 00342 * This constructor copies everything (including the bankNumber). 00343 */ 00344 bankType( const bankType& other ); 00345 00346 /** 00347 * destructor 00348 */ 00349 virtual ~bankType(); 00350 00351 /** 00352 * Set the bank identification number for this parameter set 00353 */ 00354 void setBankNumber(const int& bank); 00355 00356 /** 00357 * Get the bank identification number for this parameter set 00358 */ 00359 const int& getBankNumber() const; 00360 00361 /** 00362 * copy member. 00363 * 00364 * Please note that the bankNumber will NOT be copied. This allows 00365 * to copy one bank into another without needing to reset the bank 00366 * number. 00367 */ 00368 bankType& copy( const bankType& other ); 00369 00370 /** 00371 * returns a pointer to a clone of the parameters. 00372 */ 00373 virtual functor::parameters* clone() const; 00374 00375 /** 00376 * returns the type name 00377 */ 00378 virtual const char* getTypeName() const; 00379 00380 /** 00381 * read the parameters from the given ioHandler 00382 * @param handler the ioHandler to be used 00383 * @param complete if true (the default) the enclosing begin/end will 00384 * be also written, otherwise only the data block will be written. 00385 * @return true if write was successful 00386 */ 00387 virtual bool write(ioHandler& handler,const bool complete=true) const; 00388 00389 /** 00390 * write the parameters in a parameter-bank of the camera, 00391 * assuming that the serial port of the pulnix camera is 00392 * connected to the given serial port. This will upload only 00393 * those parameter that have changed! 00394 * @param serialPort the serial port used to communicate with 00395 * the camera. (Com1, Com2, ...) 00396 * @param force flag to indicate if everything needs to be send (true) 00397 * or if only the changed stuff needs to be send (false) 00398 * @return true if successful, false otherwise 00399 */ 00400 virtual bool 00401 upload(const serial::parameters::ePortType& serialPort, 00402 const bool force = false) const; 00403 00404 /** 00405 * activate this bank in the camera 00406 * @param serialPort the serial port used to communicate with 00407 * the camera. (Com1, Com2, ...) 00408 * @return true if successful, false otherwise 00409 */ 00410 virtual bool 00411 activate(const serial::parameters::ePortType& serialPort) const; 00412 00413 /** 00414 * read the parameters from the given ioHandler 00415 * @param handler the ioHandler to be used 00416 * @param complete if true (the default) the enclosing begin/end will 00417 * be also written, otherwise only the data block will be written. 00418 * @return true if write was successful 00419 */ 00420 virtual bool read(ioHandler& handler,const bool complete=true); 00421 00422 /** 00423 * read the parameters from the parameter-bank in the camera, 00424 * assuming that the serial port of the pulnix camera is 00425 * connected at the given serial port. This will take a while! 00426 * @param serialPort the serial port used to communicate with 00427 * the camera. (Com1, Com2, ...) 00428 * @return true if successful, false otherwise 00429 */ 00430 virtual bool download(const serial::parameters::ePortType& serialPort); 00431 00432 # ifdef _LTI_MSC_6 00433 /** 00434 * this function is required by MSVC only, as a workaround for a 00435 * very awful bug, which exists since MSVC V.4.0, and still by 00436 * V.6.0 with all bugfixes (so called "service packs") remains 00437 * there... This method is also public due to another bug, so please 00438 * NEVER EVER call this method directly: use read() instead 00439 */ 00440 bool readMS(ioHandler& handler,const bool complete=true); 00441 00442 /** 00443 * this function is required by MSVC only, as a workaround for a 00444 * very awful bug, which exists since MSVC V.4.0, and still by 00445 * V.6.0 with all bugfixes (so called "service packs") remains 00446 * there... This method is also public due to another bug, so please 00447 * NEVER EVER call this method directly: use write() instead 00448 */ 00449 bool writeMS(ioHandler& handler,const bool complete=true) const; 00450 # endif 00451 00452 /** 00453 * return the "real" values in the camera (or values out of range 00454 * if the information is not available). 00455 */ 00456 const bankType& getCameraValues() const; 00457 00458 // ------------- The Parameters --------------- 00459 00460 /** 00461 * gamma correction (valid values between 0.0 and 1.0) 00462 * Only two values are understand by the Pulnix camera: 0.45f and 1.0f. 00463 * The given value will be rounded to one of these two valid values. 00464 * 00465 * Default value: 0.45f 00466 */ 00467 float gamma; 00468 00469 /** 00470 * gain 00471 * valid values between 0 and 1.0 00472 * 00473 * Default value: 0.3569f 00474 */ 00475 float gain; 00476 00477 /** 00478 * Brightness. 00479 * These "brightness" value is achieved using the 00480 * "advanced DSP gain". Valid values are from -1.0 to 1.0 00481 * Default value 0.0; 00482 */ 00483 float brightness; 00484 00485 /** 00486 * shutter speed. 00487 * Only used if the shutterMode is DirectM or DirectA. The value 00488 * has no time units. It just means a long exposure time (1.0) 00489 * or a very short exposure time (0.0). 00490 * 00491 * HARDWARE NOTES: The values 0.0 - 1.0 will be mapped to the 00492 * from hardware expected values 1024-525 respectively. If 00493 * other hardware values are required you can give them directly 00494 * here. I.e. values between 0.0 and 1.0 (inclusive) will be 00495 * mapped to the given hardware values. Values greater or equal 00496 * 2.0 and less than 65536.0 will be directly sended to the 00497 * camera. This behaviour is also applied for the values in the 00498 * shutter tables. 00499 * 00500 * Default value: 0.2557f */ 00501 float shutterSpeed; 00502 00503 /** 00504 * shutter mode. 00505 * Specifies which shutter mode should be used (@see eShutterMode) 00506 * Default: DirectM 00507 */ 00508 ::lti::microEnablePulnix::parameters::eShutterMode shutterMode; 00509 00510 /** 00511 * specify which entry of the manual or async shutter tables should 00512 * be used (for the Manual or Async shutter modes). 00513 * The value must be between 0 and 9. 00514 * Default: 0; 00515 */ 00516 int shutterEntry; 00517 00518 /** 00519 * color matrix. This 3x3 matrix is used internally by the 00520 * Pulnix camera to transform the RGB values readed from the CCD 00521 * chip into another "color space". The values of the elements 00522 * must be between -2.96875 and 3.96875. An extra condition is 00523 * that the sum of the elements of one row should add to one. 00524 * Default value: identity matrix */ 00525 fmatrix colorMatrix; 00526 00527 /** 00528 * edgeEnhancement mode 00529 * Default value: off 00530 */ 00531 ::lti::microEnablePulnix::parameters::eEdgeEnhancement 00532 edgeEnhancementMode; 00533 00534 /** 00535 * level of edge enhancement. It must be 1 or 2. 00536 * Default: Level 1 00537 */ 00538 int edgeEnhancementLevel; 00539 00540 00541 /** 00542 * white balance 00543 * 00544 * Default value: Manual 00545 */ 00546 ::lti::microEnablePulnix::parameters::eWhiteBalanceType whiteBalance; 00547 00548 /** 00549 * Red gain. 00550 * 00551 * To see the effect of this gain factor you need to set the white 00552 * balance mode into "Manual". 00553 * 00554 * Valid values between -1.0 and 1.0 00555 * 00556 * Default value: -0.1732 00557 */ 00558 float redGain; 00559 00560 /** 00561 * Blue gain 00562 * 00563 * Valid values between -1.0 and 1.0 00564 * 00565 * To see the effect of this gain factor you need to set the white 00566 * balance mode into "Manual". 00567 * 00568 * Default value: -0.2913 00569 */ 00570 float blueGain; 00571 00572 /** 00573 * offset for the analog to digital converter (ADC) 00574 * Valid values: 200-250 00575 * Default value: 233 00576 */ 00577 int adcOffset; 00578 00579 /** 00580 * reference top value for the analog to digital converter (ADC) 00581 * Valid values: 0-255 00582 * Default value: 225 00583 */ 00584 int adcReferenceTop; 00585 00586 /** 00587 * offset for each color channel. 00588 * The value for each color must be between -128..127 00589 */ 00590 trgbPixel<int> rgbOffset; 00591 00592 /** 00593 * The Manual Shutter Table contains 10 entries, which can be 00594 * used in the shutter Manual Mode giving an entry in 00595 * shutterEntry field of the respective bank. Each entry of the 00596 * table contains a value between 0.0 and 1.0. The values have 00597 * no time units. They just means a long exposure time (1.0) or 00598 * a very short exposure time (0.0). This vector must have 10 00599 * elements 00600 */ 00601 fvector manualShutterTable; 00602 00603 /** 00604 * The Async Shutter Table contains 10 entries, which can be 00605 * used in the shutter Asynchronous Mode giving an entry in 00606 * shutterEntry field of the respective bank. Each entry of the 00607 * table contains a value between 0.0 and 1.0. The values have 00608 * no time units. They just means a long exposure time (1.0) or 00609 * a very short exposure time (0.0). This vector must have 10 00610 * elements 00611 */ 00612 fvector asyncShutterTable; 00613 00614 protected: 00615 /** 00616 * serial parameters. 00617 * 00618 * The Pulnix Camera expects 9600baud, no parity, 1 stop bit and 00619 * 8 bits per char. 00620 */ 00621 mutable serial::parameters serialParameters; 00622 00623 /** 00624 * protected initializer to create an "uninitialized" bank object 00625 */ 00626 void uninitialize(); 00627 00628 /** 00629 * the bank number in the camera, which is represented by this bank 00630 * Valid numbers from 0 to 3 00631 */ 00632 int bankNumber; 00633 00634 /** 00635 * this bank contains the values written in the camera, or out-of-range 00636 * values if they are not read/written yet. 00637 */ 00638 mutable bankType* cameraValues; 00639 00640 /** 00641 * LUT for bit reversion 00642 */ 00643 static const int* bitReversionLUT; 00644 00645 /** 00646 * initialize LUT for bit reversion 00647 */ 00648 void initBitReversionLUT(); 00649 00650 /** 00651 * revert bits 00652 */ 00653 const int& revert(const ubyte& b) const; 00654 00655 private: 00656 static bankType* allCameraValues; 00657 }; 00658 00659 /** 00660 * default constructor 00661 */ 00662 microEnablePulnix(const bool& initialize=true); 00663 00664 /** 00665 * copy constructor 00666 */ 00667 microEnablePulnix(const microEnablePulnix& other); 00668 00669 /** 00670 * constructor, sets the parameters 00671 */ 00672 microEnablePulnix(const parameters& theParam); 00673 00674 /** 00675 * destructor 00676 */ 00677 virtual ~microEnablePulnix( void ); 00678 00679 /** 00680 * returns current parameters. 00681 */ 00682 const parameters& getParameters() const; 00683 00684 /** 00685 * returns the name of this type 00686 */ 00687 virtual const char* getTypeName() const; 00688 00689 /** 00690 * load an (color) image from the grabber 00691 */ 00692 virtual bool apply(image& theImage); 00693 00694 /** 00695 * load a grey value channel from the 00696 */ 00697 virtual bool apply(channel8& theChannel); 00698 00699 /** 00700 * copy member 00701 */ 00702 microEnablePulnix& copy(const microEnablePulnix& other); 00703 00704 /** 00705 * clone member 00706 */ 00707 functor* clone() const; 00708 00709 /** 00710 * check if the frame grabber is active 00711 */ 00712 bool isActive() const; 00713 00714 /** 00715 * initialize frame grabber 00716 */ 00717 bool init(); 00718 00719 /** 00720 * set functor's parameters. This will set the frame grabber parameters 00721 * and will send the wished configuration to the camera. 00722 * 00723 * You can also load the actual parameter sets in the camera with 00724 * the method of the parameters "download". 00725 * 00726 * @return true if successful, false otherwise. 00727 */ 00728 virtual bool setParameters(const functor::parameters& theParam); 00729 00730 protected: 00731 /** 00732 * Return the error message reported by the microEnable hardware. 00733 */ 00734 std::string getErrorMessage(); 00735 00736 /** 00737 * the initialized frame grabber object 00738 */ 00739 static Fg_Info* fg; 00740 00741 /** 00742 * memory block reserved for frame-grabber communication 00743 */ 00744 static ubyte* frameBuffer; 00745 00746 /** 00747 * contains the initialization status 00748 */ 00749 static bool active; 00750 00751 /** 00752 * number of existen instances of the grabber 00753 */ 00754 static int instances; 00755 00756 /** 00757 * allocate the buffer memory 00758 */ 00759 bool allocMemory(); 00760 00761 /** 00762 * deallocate the buffer memory 00763 */ 00764 bool freeMemory(); 00765 00766 /** 00767 * free the frame graber resource 00768 */ 00769 bool freeGrabber(); 00770 00771 /** 00772 * activate hardware parameters 00773 */ 00774 bool activateParameters(); 00775 00776 /** 00777 * get an image from the frame grabber 00778 */ 00779 bool grab(image& theImage); 00780 00781 /** 00782 * get a channel8 from the frame grabber 00783 */ 00784 bool grab(channel8& theChannel); 00785 00786 /** 00787 * convert the frame buffer into an image. 00788 * theImage MUST have the correct size when this function is called! 00789 */ 00790 static void bufferToImage(image& theImage, const bool turnaround); 00791 00792 /** 00793 * convert the frame buffer into a channel8 00794 * theChannel MUST have the correct size when this function is called! 00795 */ 00796 static void bufferToChannel(channel8& theChannel, const bool turnaround); 00797 00798 /** 00799 * the last grabbed image. 00800 */ 00801 static image* lastImage; 00802 00803 }; 00804 } 00805 00806 #endif // _USE_MICRO_ENABLE_FRAME_GRABBER 00807 #endif // #ifdef _LTI_MICRO_ENABLE_H_