#include <windows.h>
 
#include <drsread.h>
 
 
 
/* The two macros below are used as error return codes */
 
/* in case the DLL does not load, or is missing one or */
 
/* more functions, respectively.  You must define them */
 
/* to whatever values are meaningful for your DLL.     */
 
#define kFailedToLoadDLLError     ???
 
#define kCouldNotFindFunction     ???
 
 
 
static HINSTANCE DLLHandle;
 
 
 
/* Declare the variables that hold the addresses of the function   */
 
/* pointers.                                                       */
 
static void (__cdecl *DRSSetMask_Ptr)(int mask);
 
static void (__cdecl *DRSSetTriggerType_Ptr)(int type);
 
static void (__cdecl *DRSSetFrequency_Ptr)(int freq);
 
static void (__cdecl *DRSSetRange_Ptr)(double range);
 
static void (__cdecl *DRSSetTriggerChannel_Ptr)(int channel);
 
static void (__cdecl *DRSSetTriggerDelay_Ptr)(double delay);
 
static void (__cdecl *DRSSetTriggerLevel_Ptr)(double level);
 
static void (__cdecl *DRSSetTriggerPolarity_Ptr)(int polarity);
 
static float *(__cdecl *DRSGetTime_Ptr)(int ch);
 
static float *(__cdecl *DRSGetWave_Ptr)(int ch);
 
static int (__cdecl *DRSInit_Ptr)();
 
static int (__cdecl *DRSRead_Ptr)(int drstimer);
 
static int (__cdecl *DRSEnd_Ptr)();
 
static int (__cdecl *DRSToBuffer_Ptr)(unsigned char *p, int m_evSerial);
 
static int (__cdecl *DRSIsTimeout_Ptr)();
 
static void (__cdecl *DRSSetTimeout_Ptr)();
 
static void (__cdecl *DRSSigInt_Ptr)(int k);
 
 
 
 
 
/* Load the DLL and get the addresses of the functions */
 
static int LoadDLLIfNeeded(void)
 
{
 
    if (DLLHandle)
 
        return 0;
 
 
 
    DLLHandle = LoadLibrary("drsread.dll");
 
    if (DLLHandle == NULL) {
 
        return kFailedToLoadDLLError;
 
        }
 
 
 
    if (!(DRSSetMask_Ptr = (void*) GetProcAddress(DLLHandle, "DRSSetMask")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTriggerType_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetTriggerType")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetFrequency_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetFrequency")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetRange_Ptr = (void*) GetProcAddress(DLLHandle, "DRSSetRange")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTriggerChannel_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetTriggerChannel")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTriggerDelay_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetTriggerDelay")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTriggerLevel_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetTriggerLevel")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTriggerPolarity_Ptr = (void*) GetProcAddress(DLLHandle, 
 
         "DRSSetTriggerPolarity")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSGetTime_Ptr = (void*) GetProcAddress(DLLHandle, "DRSGetTime")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSGetWave_Ptr = (void*) GetProcAddress(DLLHandle, "DRSGetWave")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSInit_Ptr = (void*) GetProcAddress(DLLHandle, "DRSInit")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSRead_Ptr = (void*) GetProcAddress(DLLHandle, "DRSRead")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSEnd_Ptr = (void*) GetProcAddress(DLLHandle, "DRSEnd")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSToBuffer_Ptr = (void*) GetProcAddress(DLLHandle, "DRSToBuffer")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSIsTimeout_Ptr = (void*) GetProcAddress(DLLHandle, "DRSIsTimeout")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSetTimeout_Ptr = (void*) GetProcAddress(DLLHandle, "DRSSetTimeout")))
 
        goto FunctionNotFoundError;
 
 
 
    if (!(DRSSigInt_Ptr = (void*) GetProcAddress(DLLHandle, "DRSSigInt")))
 
        goto FunctionNotFoundError;
 
 
 
    return 0;
 
 
 
FunctionNotFoundError:
 
    FreeLibrary(DLLHandle);
 
    DLLHandle = 0;
 
    return kCouldNotFindFunction;
 
}
 
 
 
 
 
/* Glue Code for each of the DLL functions */
 
 
 
 
 
 
 
void DRSSetMask(int mask)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetMask_Ptr)(mask);
 
}
 
 
 
 
 
void DRSSetTriggerType(int type)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTriggerType_Ptr)(type);
 
}
 
 
 
 
 
void DRSSetFrequency(int freq)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetFrequency_Ptr)(freq);
 
}
 
 
 
 
 
void DRSSetRange(double range)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetRange_Ptr)(range);
 
}
 
 
 
 
 
void DRSSetTriggerChannel(int channel)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTriggerChannel_Ptr)(channel);
 
}
 
 
 
 
 
void DRSSetTriggerDelay(double delay)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTriggerDelay_Ptr)(delay);
 
}
 
 
 
 
 
void DRSSetTriggerLevel(double level)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTriggerLevel_Ptr)(level);
 
}
 
 
 
 
 
void DRSSetTriggerPolarity(int polarity)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTriggerPolarity_Ptr)(polarity);
 
}
 
 
 
 
 
float *DRSGetTime(int ch)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return ???;
 
    return (*DRSGetTime_Ptr)(ch);
 
}
 
 
 
 
 
float *DRSGetWave(int ch)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return ???;
 
    return (*DRSGetWave_Ptr)(ch);
 
}
 
 
 
 
 
int DRSInit()
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return dllLoadError;
 
    return (*DRSInit_Ptr)();
 
}
 
 
 
 
 
int DRSRead(int drstimer)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return dllLoadError;
 
    return (*DRSRead_Ptr)(drstimer);
 
}
 
 
 
 
 
int DRSEnd()
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return dllLoadError;
 
    return (*DRSEnd_Ptr)();
 
}
 
 
 
 
 
int DRSToBuffer(unsigned char *p, int m_evSerial)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return dllLoadError;
 
    return (*DRSToBuffer_Ptr)(p, m_evSerial);
 
}
 
 
 
 
 
int DRSIsTimeout()
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return dllLoadError;
 
    return (*DRSIsTimeout_Ptr)();
 
}
 
 
 
 
 
void DRSSetTimeout()
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSetTimeout_Ptr)();
 
}
 
 
 
 
 
void DRSSigInt(int k)
 
{
 
    int dllLoadError;
 
 
 
    if (dllLoadError = LoadDLLIfNeeded())
 
        return;
 
    (*DRSSigInt_Ptr)(k);
 
}