//---------------------------------------------------------------------------
//
//  TFI Device Control Interface Link
//
//  Code to dynamically link to the TFI Device Control Interface DLL
//
//  Copyright © 2005-2013 Peter D. Mousley
//
//---------------------------------------------------------------------------
#pragma hdrstop
#include "pmDevCtrlInterfaceLink.h"
//---------------------------------------------------------------------------

  HINSTANCE dciHandle = NULL;

  FuncPtrII dciInit;
  FuncPtrIV dciInitialised;

  FuncPtrIV dciLoadDaq;
  FuncPtrIV dciDaqLoaded;

  FuncPtrIV dciNumDevices;
  FuncPtrIIpCI dciGetDeviceName;
  FuncPtrIpC dciAddDevice;
  FuncPtrII dciRemoveDeviceNum;
  FuncPtrIpC dciRemoveDevice;
  FuncPtrIV dciRemoveAllDevices;

  FuncPtrII dciDeviceNumChannels;
  FuncPtrIV dciTotalNumChannels;
  FuncPtrIIpI dciGetDeviceChannels;
  FuncPtrIIpI dciSetDeviceChannels;
  FuncPtrIIpF dciGetDeviceVoltageScales;
  FuncPtrIIpF dciSetDeviceVoltageScales;
  FuncPtrIIpF dciGetDeviceVoltageOffsets;
  FuncPtrIIpF dciSetDeviceVoltageOffsets;

  FuncPtrIIpC dciSetDeviceTFFileName;

  FuncPtrIV dciZeroAllDevices;

  FuncPtrIV dciMonitorDevices;
  FuncPtrIV dciStopMonitoringDevices;

  FuncPtrFV dciAcquisitionScanRate;
  FuncPtrIF dciSetAcquisitionScanRate;
  FuncPtrIV dciAcquisitionBlockSize;
  FuncPtrII dciSetAcquisitionBlockSize;
  FuncPtrIV dciOverSamplingRatio;
  FuncPtrII dciSetOverSamplingRatio;

  FuncPtrIV dciOutputFileNameLength;
  FuncPtrIpCI dciGetOutputFileName;
  FuncPtrIpC dciSetOutputFileName;
  FuncPtrIV dciOutputTimeHistoryFile;
  FuncPtrII dciSetOutputTimeHistoryFile;
  FuncPtrIV dciOutputSummaryFile;
  FuncPtrII dciSetOutputSummaryFile;

  FuncPtrFV dciTemperature;
  FuncPtrIF dciSetTemperature;
  FuncPtrFV dciAbsPressure;
  FuncPtrIF dciSetAbsPressure;

  FuncPtrIV dciSampleAndProcess;
  FuncPtrIV dciStopProcessing;
  FuncPtrIV dciProcessing;

  FuncPtrIV dciPrepareToPostProcess;
  FuncPtrIppF dciPostProcess;
  FuncPtrIpF dciPostProcess1D;
  FuncPtrIhLab2 dciPostProcessLV;
  FuncPtrIpC dciPostProcessTHFile;
  FuncPtrIV dciDonePostProcessing;

  FuncPtrIIppF dciGetData_FilteredPressure;
  FuncPtrIIpFpFpFpF dciGetData_UVW;
  FuncPtrIIpFpFpFpF dciGetData_VelPitchYaw;

//---------------------------------------------------------------------------
int __stdcall dcilLoadInterface(void)
{
 // Load the interface DLL and obtain pointers to its exported functions

 // Free any existing library
  dcilFreeInterface();

 // Load library
  dciHandle = LoadLibrary(dciDLLName);
 // Return if failed
  if (!dciHandle)
    return dciERROR;

 // Get function pointers
  dciInit = (FuncPtrII)GetProcAddress(dciHandle, "dciInit");
  dciInitialised = (FuncPtrIV)GetProcAddress(dciHandle, "dciInitialised");

  dciLoadDaq = (FuncPtrIV)GetProcAddress(dciHandle, "dciLoadDaq");
  dciDaqLoaded = (FuncPtrIV)GetProcAddress(dciHandle, "dciDaqLoaded");

  dciNumDevices = (FuncPtrIV)GetProcAddress(dciHandle, "dciNumDevices");
  dciGetDeviceName = (FuncPtrIIpCI)GetProcAddress(dciHandle, "dciGetDeviceName");
  dciAddDevice = (FuncPtrIpC)GetProcAddress(dciHandle, "dciAddDevice");
  dciRemoveDeviceNum = (FuncPtrII)GetProcAddress(dciHandle, "dciRemoveDeviceNum");
  dciRemoveDevice = (FuncPtrIpC)GetProcAddress(dciHandle, "dciRemoveDevice");
  dciRemoveAllDevices = (FuncPtrIV)GetProcAddress(dciHandle, "dciRemoveAllDevices");

  dciDeviceNumChannels = (FuncPtrII)GetProcAddress(dciHandle, "dciDeviceNumChannels");
  dciTotalNumChannels = (FuncPtrIV)GetProcAddress(dciHandle, "dciTotalNumChannels");
  dciGetDeviceChannels = (FuncPtrIIpI)GetProcAddress(dciHandle, "dciGetDeviceChannels");
  dciSetDeviceChannels = (FuncPtrIIpI)GetProcAddress(dciHandle, "dciSetDeviceChannels");
  dciGetDeviceVoltageScales = (FuncPtrIIpF)GetProcAddress(dciHandle, "dciGetDeviceVoltageScales");
  dciSetDeviceVoltageScales = (FuncPtrIIpF)GetProcAddress(dciHandle, "dciSetDeviceVoltageScales");
  dciGetDeviceVoltageOffsets = (FuncPtrIIpF)GetProcAddress(dciHandle, "dciGetDeviceVoltageOffsets");
  dciSetDeviceVoltageOffsets = (FuncPtrIIpF)GetProcAddress(dciHandle, "dciSetDeviceVoltageOffsets");

  dciSetDeviceTFFileName = (FuncPtrIIpC)GetProcAddress(dciHandle, "dciSetDeviceTFFileName");

  dciZeroAllDevices = (FuncPtrIV)GetProcAddress(dciHandle, "dciZeroAllDevices");

  dciMonitorDevices = (FuncPtrIV)GetProcAddress(dciHandle, "dciMonitorDevices");
  dciStopMonitoringDevices = (FuncPtrIV)GetProcAddress(dciHandle, "dciStopMonitoringDevices");

  dciAcquisitionScanRate = (FuncPtrFV)GetProcAddress(dciHandle, "dciAcquisitionScanRate");
  dciSetAcquisitionScanRate = (FuncPtrIF)GetProcAddress(dciHandle, "dciSetAcquisitionScanRate");
  dciAcquisitionBlockSize = (FuncPtrIV)GetProcAddress(dciHandle, "dciAcquisitionBlockSize");
  dciSetAcquisitionBlockSize = (FuncPtrII)GetProcAddress(dciHandle, "dciSetAcquisitionBlockSize");
  dciOverSamplingRatio = (FuncPtrIV)GetProcAddress(dciHandle, "dciOverSamplingRatio");
  dciSetOverSamplingRatio = (FuncPtrII)GetProcAddress(dciHandle, "dciSetOverSamplingRatio");

  dciOutputFileNameLength = (FuncPtrIV)GetProcAddress(dciHandle, "dciOutputFileNameLength");
  dciGetOutputFileName = (FuncPtrIpCI)GetProcAddress(dciHandle, "dciGetOutputFileName");
  dciSetOutputFileName = (FuncPtrIpC)GetProcAddress(dciHandle, "dciSetOutputFileName");
  dciOutputTimeHistoryFile = (FuncPtrIV)GetProcAddress(dciHandle, "dciOutputTimeHistoryFile");
  dciSetOutputTimeHistoryFile = (FuncPtrII)GetProcAddress(dciHandle, "dciSetOutputTimeHistoryFile");
  dciOutputSummaryFile = (FuncPtrIV)GetProcAddress(dciHandle, "dciOutputSummaryFile");
  dciSetOutputSummaryFile = (FuncPtrII)GetProcAddress(dciHandle, "dciSetOutputSummaryFile");

  dciTemperature = (FuncPtrFV)GetProcAddress(dciHandle, "dciTemperature");
  dciSetTemperature = (FuncPtrIF)GetProcAddress(dciHandle, "dciSetTemperature");
  dciAbsPressure = (FuncPtrFV)GetProcAddress(dciHandle, "dciAbsPressure");
  dciSetAbsPressure = (FuncPtrIF)GetProcAddress(dciHandle, "dciSetAbsPressure");

  dciSampleAndProcess = (FuncPtrIV)GetProcAddress(dciHandle, "dciSampleAndProcess");
  dciStopProcessing = (FuncPtrIV)GetProcAddress(dciHandle, "dciStopProcessing");
  dciProcessing = (FuncPtrIV)GetProcAddress(dciHandle, "dciProcessing");

  dciPrepareToPostProcess = (FuncPtrIV)GetProcAddress(dciHandle, "dciPrepareToPostProcess");
  dciPostProcess = (FuncPtrIppF)GetProcAddress(dciHandle, "dciPostProcess");
  dciPostProcess1D = (FuncPtrIpF)GetProcAddress(dciHandle, "dciPostProcess1D");
  dciPostProcessLV = (FuncPtrIhLab2)GetProcAddress(dciHandle, "dciPostProcessLV");
  dciPostProcessTHFile = (FuncPtrIpC)GetProcAddress(dciHandle, "dciPostProcessTHFile");
  dciDonePostProcessing = (FuncPtrIV)GetProcAddress(dciHandle, "dciDonePostProcessing");

  dciGetData_FilteredPressure = (FuncPtrIIppF)GetProcAddress(dciHandle, "dciGetData_FilteredPressure");
  dciGetData_UVW = (FuncPtrIIpFpFpFpF)GetProcAddress(dciHandle, "dciGetData_UVW");
  dciGetData_VelPitchYaw = (FuncPtrIIpFpFpFpF)GetProcAddress(dciHandle, "dciGetData_VelPitchYaw");

 // Check all pointers loaded
  if ( !dcilFunctionPointersLoaded() )
    return dciERROR;

  return dciOK;
}
//---------------------------------------------------------------------------
int __stdcall dcilFreeInterface(void)
{
 // Free the interface DLL and reset the function pointers

 // Set all pointers to NULL
  dcilInitFunctionPointers();

 // Free DLL if loaded
  if (dciHandle)
    FreeLibrary(dciHandle);

  return dciOK;
}
//---------------------------------------------------------------------------
void __stdcall dcilInitFunctionPointers(void)
{
 // Initialise function pointers to NULL

  dciInit = NULL;
  dciInitialised = NULL;

  dciLoadDaq = NULL;
  dciDaqLoaded = NULL;

  dciNumDevices = NULL;
  dciGetDeviceName = NULL;
  dciAddDevice = NULL;
  dciRemoveDeviceNum = NULL;
  dciRemoveDevice = NULL;
  dciRemoveAllDevices = NULL;

  dciDeviceNumChannels = NULL;
  dciTotalNumChannels = NULL;
  dciGetDeviceChannels = NULL;
  dciSetDeviceChannels = NULL;
  dciGetDeviceVoltageScales = NULL;
  dciSetDeviceVoltageScales = NULL;
  dciGetDeviceVoltageOffsets = NULL;
  dciSetDeviceVoltageOffsets = NULL;

  dciSetDeviceTFFileName = NULL;

  dciZeroAllDevices = NULL;

  dciMonitorDevices = NULL;
  dciStopMonitoringDevices = NULL;

  dciAcquisitionScanRate = NULL;
  dciSetAcquisitionScanRate = NULL;
  dciAcquisitionBlockSize = NULL;
  dciSetAcquisitionBlockSize = NULL;
  dciOverSamplingRatio = NULL;
  dciSetOverSamplingRatio = NULL;

  dciOutputFileNameLength = NULL;
  dciGetOutputFileName = NULL;
  dciSetOutputFileName = NULL;
  dciOutputTimeHistoryFile = NULL;
  dciSetOutputTimeHistoryFile = NULL;
  dciOutputSummaryFile = NULL;
  dciSetOutputSummaryFile = NULL;

  dciTemperature = NULL;
  dciSetTemperature = NULL;
  dciAbsPressure = NULL;
  dciSetAbsPressure = NULL;

  dciSampleAndProcess = NULL;
  dciStopProcessing = NULL;
  dciProcessing = NULL;

  dciPrepareToPostProcess = NULL;
  dciPostProcess = NULL;
  dciPostProcess1D = NULL;
  dciPostProcessLV = NULL;
  dciPostProcessTHFile = NULL;
  dciDonePostProcessing = NULL;

  dciGetData_FilteredPressure = NULL;
  dciGetData_UVW = NULL;
  dciGetData_VelPitchYaw = NULL;
}
//---------------------------------------------------------------------------
int __stdcall dcilFunctionPointersLoaded(void)
{
 // Check all function pointers have been loaded

  return (    (dciInit != NULL)
           && (dciInitialised != NULL)

           && (dciLoadDaq != NULL)
           && (dciDaqLoaded != NULL)

           && (dciNumDevices != NULL)
           && (dciGetDeviceName != NULL)
           && (dciAddDevice != NULL)
           && (dciRemoveDeviceNum != NULL)
           && (dciRemoveDevice != NULL)
           && (dciRemoveAllDevices != NULL)

           && (dciDeviceNumChannels != NULL)
           && (dciTotalNumChannels != NULL)
           && (dciGetDeviceChannels != NULL)
           && (dciSetDeviceChannels != NULL)
           && (dciGetDeviceVoltageScales != NULL)
           && (dciSetDeviceVoltageScales != NULL)
           && (dciGetDeviceVoltageOffsets != NULL)
           && (dciSetDeviceVoltageOffsets != NULL)

           && (dciSetDeviceTFFileName != NULL)

           && (dciZeroAllDevices != NULL)

           && (dciMonitorDevices != NULL)
           && (dciStopMonitoringDevices != NULL)

           && (dciAcquisitionScanRate != NULL)
           && (dciSetAcquisitionScanRate != NULL)
           && (dciAcquisitionBlockSize != NULL)
           && (dciSetAcquisitionBlockSize != NULL)
           && (dciOverSamplingRatio != NULL)
           && (dciSetOverSamplingRatio != NULL)

           && (dciOutputFileNameLength != NULL)
           && (dciGetOutputFileName != NULL)
           && (dciSetOutputFileName != NULL)
           && (dciOutputTimeHistoryFile != NULL)
           && (dciSetOutputTimeHistoryFile != NULL)
           && (dciOutputSummaryFile != NULL)
           && (dciSetOutputSummaryFile != NULL)

           && (dciTemperature != NULL)
           && (dciSetTemperature != NULL)
           && (dciAbsPressure != NULL)
           && (dciSetAbsPressure != NULL)

           && (dciSampleAndProcess != NULL)
           && (dciStopProcessing != NULL)
           && (dciProcessing != NULL)

           && (dciPrepareToPostProcess != NULL)
           && (dciPostProcess != NULL)
           && (dciPostProcess1D != NULL)
           && (dciPostProcessLV != NULL)
           && (dciPostProcessTHFile != NULL)
           && (dciDonePostProcessing != NULL)

           && (dciGetData_FilteredPressure != NULL)
           && (dciGetData_UVW != NULL)
           && (dciGetData_VelPitchYaw != NULL) );
}
//---------------------------------------------------------------------------

