#ifndef KY_DRIVER_GENTL_H_
#define KY_DRIVER_GENTL_H_
#include "ky_os.h"
#include "GenTL_v1_5.h"
using namespace GenTL;

struct tl_calls
{
    ky_fn_declare(GCGetInfo)
    ky_fn_declare(GCGetLastError)
    ky_fn_declare(GCInitLib)
    ky_fn_declare(GCCloseLib)
    ky_fn_declare(GCReadPort)
    ky_fn_declare(GCWritePort)
    ky_fn_declare(GCGetPortURL)
    ky_fn_declare(GCGetPortInfo)
    ky_fn_declare(GCRegisterEvent)
    ky_fn_declare(GCUnregisterEvent)
    ky_fn_declare(EventGetData)
    ky_fn_declare(EventGetDataInfo)
    ky_fn_declare(EventGetInfo)
    ky_fn_declare(EventFlush)
    ky_fn_declare(EventKill)
    ky_fn_declare(TLOpen)
    ky_fn_declare(TLClose)
    ky_fn_declare(TLGetInfo)
    ky_fn_declare(TLGetNumInterfaces)
    ky_fn_declare(TLGetInterfaceID)
    ky_fn_declare(TLGetInterfaceInfo)
    ky_fn_declare(TLOpenInterface)
    ky_fn_declare(TLUpdateInterfaceList)
    ky_fn_declare(IFClose)
    ky_fn_declare(IFGetInfo)
    ky_fn_declare(IFGetNumDevices)
    ky_fn_declare(IFGetDeviceID)
    ky_fn_declare(IFUpdateDeviceList)
    ky_fn_declare(IFGetDeviceInfo)
    ky_fn_declare(IFOpenDevice)
    ky_fn_declare(DevGetPort)
    ky_fn_declare(DevGetNumDataStreams)
    ky_fn_declare(DevGetDataStreamID)
    ky_fn_declare(DevOpenDataStream)
    ky_fn_declare(DevGetInfo)
    ky_fn_declare(DevClose)
    ky_fn_declare(DSAnnounceBuffer)
    ky_fn_declare(DSAllocAndAnnounceBuffer)
    ky_fn_declare(DSFlushQueue)
    ky_fn_declare(DSStartAcquisition)
    ky_fn_declare(DSStopAcquisition)
    ky_fn_declare(DSGetInfo)
    ky_fn_declare(DSGetBufferID)
    ky_fn_declare(DSClose)
    ky_fn_declare(DSRevokeBuffer)
    ky_fn_declare(DSQueueBuffer)
    ky_fn_declare(DSGetBufferInfo)
    ky_fn_declare(GCGetNumPortURLs)
    ky_fn_declare(GCGetPortURLInfo)
    ky_fn_declare(GCReadPortStacked)
    ky_fn_declare(GCWritePortStacked)
    ky_fn_declare(DSGetBufferChunkData)
    ky_fn_declare(IFGetParentTL)
    ky_fn_declare(DevGetParentIF)
    ky_fn_declare(DSGetParentDev)
    ky_fn_declare(DSGetNumBufferParts)
    ky_fn_declare(DSGetBufferPartInfo)
};
/* Structure to hold function pointers for GenTL API calls */


/* Helper to load all GenTL API call symbols from the cti - needed for reuse.
* Macro rather than function because of the side-effects (includes test
* statements expected to be executed within the test procedure. */
#define LOAD_SYMBOLS(_tl_, _hcti_) \
  ky_fn_load (_tl_, _hcti_, GCGetInfo) \
  ky_fn_load (_tl_, _hcti_, GCGetLastError) \
  ky_fn_load (_tl_, _hcti_, GCInitLib) \
  ky_fn_load (_tl_, _hcti_, GCCloseLib) \
  ky_fn_load (_tl_, _hcti_, GCReadPort) \
  ky_fn_load (_tl_, _hcti_, GCWritePort) \
  ky_fn_load (_tl_, _hcti_, GCGetPortURL) \
  ky_fn_load (_tl_, _hcti_, GCGetPortInfo) \
  ky_fn_load (_tl_, _hcti_, GCRegisterEvent) \
  ky_fn_load (_tl_, _hcti_, GCUnregisterEvent) \
  ky_fn_load (_tl_, _hcti_, EventGetData) \
  ky_fn_load (_tl_, _hcti_, EventGetDataInfo) \
  ky_fn_load (_tl_, _hcti_, EventGetInfo) \
  ky_fn_load (_tl_, _hcti_, EventFlush) \
  ky_fn_load (_tl_, _hcti_, EventKill) \
  ky_fn_load (_tl_, _hcti_, TLOpen) \
  ky_fn_load (_tl_, _hcti_, TLClose) \
  ky_fn_load (_tl_, _hcti_, TLGetInfo) \
  ky_fn_load (_tl_, _hcti_, TLGetNumInterfaces) \
  ky_fn_load (_tl_, _hcti_, TLGetInterfaceID) \
  ky_fn_load (_tl_, _hcti_, TLGetInterfaceInfo) \
  ky_fn_load (_tl_, _hcti_, TLOpenInterface) \
  ky_fn_load (_tl_, _hcti_, TLUpdateInterfaceList) \
  ky_fn_load (_tl_, _hcti_, IFClose) \
  ky_fn_load (_tl_, _hcti_, IFGetInfo) \
  ky_fn_load (_tl_, _hcti_, IFGetNumDevices) \
  ky_fn_load (_tl_, _hcti_, IFGetDeviceID) \
  ky_fn_load (_tl_, _hcti_, IFUpdateDeviceList) \
  ky_fn_load (_tl_, _hcti_, IFGetDeviceInfo) \
  ky_fn_load (_tl_, _hcti_, IFOpenDevice) \
  ky_fn_load (_tl_, _hcti_, DevGetPort) \
  ky_fn_load (_tl_, _hcti_, DevGetNumDataStreams) \
  ky_fn_load (_tl_, _hcti_, DevGetDataStreamID) \
  ky_fn_load (_tl_, _hcti_, DevOpenDataStream) \
  ky_fn_load (_tl_, _hcti_, DevGetInfo) \
  ky_fn_load (_tl_, _hcti_, DevClose) \
  ky_fn_load (_tl_, _hcti_, DSAnnounceBuffer) \
  ky_fn_load (_tl_, _hcti_, DSAllocAndAnnounceBuffer) \
  ky_fn_load (_tl_, _hcti_, DSFlushQueue) \
  ky_fn_load (_tl_, _hcti_, DSStartAcquisition) \
  ky_fn_load (_tl_, _hcti_, DSStopAcquisition) \
  ky_fn_load (_tl_, _hcti_, DSGetInfo) \
  ky_fn_load (_tl_, _hcti_, DSGetBufferID) \
  ky_fn_load (_tl_, _hcti_, DSClose) \
  ky_fn_load (_tl_, _hcti_, DSRevokeBuffer) \
  ky_fn_load (_tl_, _hcti_, DSQueueBuffer) \
  ky_fn_load (_tl_, _hcti_, DSGetBufferInfo) \
  ky_fn_load (_tl_, _hcti_, GCGetNumPortURLs) \
  ky_fn_load (_tl_, _hcti_, GCGetPortURLInfo) \
  ky_fn_load (_tl_, _hcti_, GCReadPortStacked) \
  ky_fn_load (_tl_, _hcti_, GCWritePortStacked) \
  ky_fn_load (_tl_, _hcti_, DSGetBufferChunkData) \
  ky_fn_load (_tl_, _hcti_, IFGetParentTL) \
  ky_fn_load (_tl_, _hcti_, DevGetParentIF) \
  ky_fn_load (_tl_, _hcti_, DSGetParentDev) \
  ky_fn_load (_tl_, _hcti_, DSGetNumBufferParts) \
  ky_fn_load (_tl_, _hcti_, DSGetBufferPartInfo)

/* Its counterpart for symmetry */
#define FREE_SYMBOLS(_tl_) memset (&_tl_, 0, sizeof(_tl_));

#endif //KY_DRIVER_GENTL_H_