//-----------------------------------------------------------------------------
//  (c) 2009 by Basler
//  Section: Digital Imaging
//  Project: CLProtocol
//  Author:  Fritz Dierks
//  $Header$
//
//  License: This file is published under the license of the EMVA GenICam  Standard Group. 
//  A text file describing the legal terms is included in  your installation as 'GenICam_license.pdf'. 
//  If for some reason you are missing  this file please contact the EMVA or visit the website
//  (http://www.genicam.org) for a full copy.
// 
//  THIS SOFTWARE IS PROVIDED BY THE EMVA GENICAM STANDARD GROUP "AS IS"
//  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  
//  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE EMVA GENICAM STANDARD  GROUP 
//  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  SPECIAL, 
//  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  LIMITED TO, 
//  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  DATA, OR PROFITS; 
//  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  THEORY OF LIABILITY, 
//  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) 
//  ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
//  POSSIBILITY OF SUCH DAMAGE.
//-----------------------------------------------------------------------------
/*!
    \file
*/

#ifndef _SERILADAPTERCSTYLE_H_
#define _SERILADAPTERCSTYLE_H_

#include <CLProtocol\ISerialAdapter.h>

#if( defined(__cplusplus) || defined(__cplusplus__) ) 
    extern "C"
#else
    namespace CLProtocol
#endif
    // The following declarations enable you to create an ISerialAdapter using pure C. 
    // For an example see RequirementsAndTests::TestIStructCVersion in CLProtocolTest 
    // The following link gives some technical background http://www.codeproject.com/KB/COM/com_in_c1.aspx
    {

        typedef CLINT32 (CLPROTOCOL *clSerialReadPtr)(
                void * This,
                CLINT8* buffer,
                CLUINT32* bufferSize,
                CLUINT32  serialTimeOut
                );

        typedef CLINT32 (CLPROTOCOL *clSerialWritePtr)(
                void * This,
                CLINT8* buffer,
                CLUINT32* bufferSize,
                CLUINT32 serialTimeOut
                );

        typedef CLINT32 (CLPROTOCOL *clGetSupportedBaudRatesPtr)(
                void * This,
                CLUINT32 *baudRates
                );  

        typedef CLINT32 (CLPROTOCOL *clSetBaudRatePtr)( 
                void * This,
                CLUINT32 baudRate
                );

        typedef CLINT32 (CLPROTOCOL *SerialInitPtr)( 
                void * This
                );

        typedef void (CLPROTOCOL *SerialClosePtr)( 
                void * This
                );

        typedef void (CLPROTOCOL *CheckErrorPtr)( 
                void * This,
                CLUINT32 ErrorCode
                );

        typedef struct ISerialAdapterVtbl_t
        {
            clSerialReadPtr *clSerialRead;
            clSerialWritePtr *clSerialWrite;
            clGetSupportedBaudRatesPtr *clGetSupportedBaudRates;
            clSetBaudRatePtr *clSetBaudRate;
            SerialInitPtr *SerialInit;
            SerialClosePtr *SerialClose;
            CheckErrorPtr *CheckError;
        } ISerialAdapterVtbl_t;

        typedef struct ISerialAdapter_t
        {
            struct ISerialAdapterVtbl_t *lpVtbl;
        } ISerialAdapter_t;

    }

#endif 
