#ifndef __Spectrum_h__
#define __Spectrum_h__
/****************************************************************************

Module: Spectrum.h

Purpose:

    This module contains definitions required when calling the Spectrum API 
    routines from C or C++.

   *************************************************************************
   *                                                                       *
   *     Produced by:       Veriteq Instruments Inc.                       *
   *                                                                       *
   *                        Suite 113                                      *
   *                        10451 Shellbridge Way                          *
   *                        Richmond, British Columbia                     *
   *                        Canada.   V6X 2W8                              *
   *                                                                       *
   *************************************************************************

****************************************************************************/



/////////////////////////////////////////////////////////////////////////////
// Define the status codes returned by the Spectrum API routines. Ensure 
// they are not the same as the dialog box button IDs (1-9).
/////////////////////////////////////////////////////////////////////////////

#define SPC_SC_Success                       0
#define SPC_SC_UnknownError                 -1
#define SPC_SC_Cancelled                    -2
#define SPC_SC_InvMemoryAddress             -3
#define SPC_SC_InvComPortNumber             -4
#define SPC_SC_InvLoggerAddress             -5
#define SPC_SC_InvLoggerHandle              -6
#define SPC_SC_InvLoggerMode                -7
#define SPC_SC_InvChannelIndex              -8
#define SPC_SC_InvSerialNumber              -9
#define SPC_SC_FailStartTimer              -10
#define SPC_SC_FailAllocateMemory          -11
#define SPC_SC_FailDisableChannel          -12
#define SPC_SC_FailEnableChannel           -13
#define SPC_SC_FailClearDataPtr            -14
#define SPC_SC_FailClearWrapFlag           -15
#define SPC_SC_FailProgramLogger           -16
#define SPC_SC_InvTemperature              -17
#define SPC_SC_InvHumidity                 -18
#define SPC_SC_InvSampleInterval           -19
#define SPC_SC_FieldReadOnly               -20
#define SPC_SC_FailCreateSpl            -10000
#define SPC_SC_FailOpenSpl              -10001
#define SPC_SC_FailReadSpl              -10002
#define SPC_SC_InvSplFormat             -10003
#define SPC_SC_InvSplDescription        -10004
#define SPC_SC_InvSplStartTime          -10005
#define SPC_SC_InvSplSystemBlock        -10006
#define SPC_SC_InvSplSample             -10007
#define SPC_SC_InvSplChecksum           -10008
#define SPC_SC_InvSplUsername           -10009
#define SPC_SC_InvSplPassword           -10010
#define SPC_SC_InvSplCreationTime       -10011
#define SPC_SC_NoSplChanEnabled         -10012
#define SPC_SC_FailAllocateCom          -20000
#define SPC_SC_FailAllocateCom1         -20001
#define SPC_SC_FailAllocateCom2         -20002
#define SPC_SC_FailAllocateCom3         -20003
#define SPC_SC_FailAllocateCom4         -20004
#define SPC_SC_FailSetupCom             -20010
#define SPC_SC_FailSetupCom1            -20011
#define SPC_SC_FailSetupCom2            -20012
#define SPC_SC_FailSetupCom3            -20013
#define SPC_SC_FailSetupCom4            -20014
#define SPC_SC_FailCommCom              -20020
#define SPC_SC_FailCommCom1             -20021
#define SPC_SC_FailCommCom2             -20022
#define SPC_SC_FailCommCom3             -20023
#define SPC_SC_FailCommCom4             -20024
#define SPC_SC_InvLoggerData            -20030
#define SPC_SC_InvHardwareModel         -20031
#define SPC_SC_DifferentLogger          -20032
#define SPC_SC_FailPrintDoc             -30000
#define SPC_SC_FailOpenClipbrd          -30001
#define SPC_SC_FailEmptyClipbrd         -30002
#define SPC_SC_FailCloseClipbrd         -30003
#define SPC_SC_FailCopyToClipbrd        -30004
#define SPC_SC_FailCreateExpFile        -30005
#define SPC_SC_FailCreateBitmap         -30006
#define SPC_SC_FailCopyBitmap           -30007
#define SPC_SC_FailSelectBitmap         -30008
#define SPC_SC_FailLoadBitmap           -30009



/////////////////////////////////////////////////////////////////////////////
// Define the types.
/////////////////////////////////////////////////////////////////////////////

#ifndef UCHAR
#define UCHAR unsigned char
#endif

#ifndef LONG
#define LONG long
#endif

#ifndef ULONG
#define ULONG unsigned long
#endif

typedef LONG  SPT_lBaudRate;
typedef LONG  SPT_lChannelIndex;
typedef LONG  SPT_lComPortNumber;
typedef ULONG SPT_ulLoggerAddress;
typedef ULONG SPT_ulLoggerHandle;
typedef LONG  SPT_lPacketSize;
typedef LONG  SPT_lSampleCount;
typedef LONG  SPT_lStatusCode;
typedef LONG  SPT_lTime;



// Define the baud rates.
#define SPC_BaudRate_57600 57600
#define SPC_BaudRate_38400 38400
#define SPC_BaudRate_19200 19200
#define SPC_BaudRate_9600  9600
#define SPC_BaudRate_4800  4800
#define SPC_BaudRate_2400  2400
#define SPC_BaudRate_Auto  -1



// Define the packet sizes.
#define SPC_PacketSize_512  512
#define SPC_PacketSize_256  256
#define SPC_PacketSize_128  128
#define SPC_PacketSize_64   64
#define SPC_PacketSize_32   32
#define SPC_PacketSize_16   16
#define SPC_PacketSize_Auto -1



/////////////////////////////////////////////////////////////////////////////
// Define some structures.
/////////////////////////////////////////////////////////////////////////////



// Set structure packing to byte boundaries.
#pragma pack(push, 1)



// Define the population structure.
typedef struct
{
   SPT_ulLoggerAddress ulLoggerAddress;
   char                szSerialNumber[ 9];
   char                szDescription [41];
   UCHAR               aucPadding    [10]; // Pad to 16 byte boundary.
} SPT_Population;



// Restore structure packing to default.
#pragma pack(pop)



/////////////////////////////////////////////////////////////////////////////
// Define the Spectrum API routines.
/////////////////////////////////////////////////////////////////////////////

#ifndef SPC_Declspec
#define SPC_Declspec __declspec(dllimport)
#endif

#ifndef SPC_CallType
#define SPC_CallType __stdcall
#endif

SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_GetApiDate            (char*                pszApiDate);
SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_GetApiVersion         (char*                pszApiVersion);
SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_GetProtocol           (BOOL*                pbPhase2);
SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_GetTemperatureScale   (BOOL*                pbCelsius);
SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_SetProtocol           (BOOL                 bPhase2);
SPC_Declspec SPT_lStatusCode SPC_CallType SPAPI_SetTemperatureScale   (BOOL                 bCelsius);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_ClearLogger           (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_ExploreNetwork        (SPT_lComPortNumber   lComPortNumber);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_SetupChannels         (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_SetupDescription      (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_SetupLogger           (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_SetupSampleInterval   (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPDLG_TransferSamples       (SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress,
                                                                       char*                pszLoggerFileName);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_ClearLogger           (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_CreateLoggerObject    (SPT_ulLoggerHandle*  pulLoggerHandle);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_DeleteLoggerObject    (SPT_ulLoggerHandle   ulLoggerHandle);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetChannelDescription (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       char*                pszChannelDescription);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetChannelEnabled     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       BOOL*                pbChannelEnabled);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetChannelValue       (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       double*              pdChannelValue);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetChannelSamples     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       double*              padChannelSamples);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetChannelUnits       (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       char*                pszChannelUnits);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetDescription        (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszDescription);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetFirmwareVersion    (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszFirmwareVersion);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetHardwareModel      (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszHardwareModel);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetHardwareRevision   (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszHardwareRevision);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetSampleCount        (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lSampleCount*    plSampleCount);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetSampleInterval     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lTime*           plSampleInterval);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetSampleStartTime    (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lTime*           plSampleStartTime);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_GetSerialNumber       (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszSerialNumber);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_ReadChannelValues     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_ReadLogger            (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_ulLoggerAddress  ulLoggerAddress,
                                                                       char*                pszLoggerFileName);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_ReadLoggerFile        (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       char*                pszLoggerFileName);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_SetChannelDescription (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       char*                pszChannelDescription);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_SetChannelEnabled     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       BOOL                 bChannelEnabled);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_SetChannelUnits       (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_lChannelIndex    lChannelIndex,
                                                                       char*                pszChannelUnits);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_SetDescription        (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       char*                pszDescription);
SPC_Declspec SPT_lStatusCode SPC_CallType SPLGR_SetSampleInterval     (SPT_ulLoggerHandle   ulLoggerHandle,
                                                                       SPT_lComPortNumber   lComPortNumber,
                                                                       SPT_lTime            lSampleInterval);
SPC_Declspec SPT_lStatusCode SPC_CallType SPNWK_GetPopulation         (SPT_lComPortNumber   lComPortNumber,
                                                                       LONG                 lMaxCount,
                                                                       SPT_Population*      pPopulation,
                                                                       LONG*                plActualCount);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_FormatDate            (SPT_lTime            lTime, 
                                                                       char*                pszDateText);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_FormatDateAndTime     (SPT_lTime            lTime, 
                                                                       char*                pszDateAndTimeText);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_FormatStatusCode      (SPT_lStatusCode      lStatusCode, 
                                                                       char*                pszStatusText);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_FormatTime            (SPT_lTime            lTime, 
                                                                       char*                pszTimeText);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_LoggerAddrToSerialNum (SPT_ulLoggerAddress  ulLoggerAddress,
                                                                       char*                pszSerialNumber);
SPC_Declspec SPT_lStatusCode SPC_CallType SPUTL_SerialNumToLoggerAddr (char*                pszSerialNumber,
                                                                       SPT_ulLoggerAddress* pulLoggerAddress);
                                            
#endif
