//==============================================================================
//
//  Title	  : NIIMAQdx.h
//  Created	  : 1403685834 seconds after 1/1/1970 12:00:00 UTC 
//  Copyright : © Copyright 2006, National Instruments Corporation, All rights reserved
// 	Purpose	  : Include file for NI-IMAQdx library support.
//
//==============================================================================
#ifndef ___niimaqdx_h___
#define ___niimaqdx_h___


#ifdef __cplusplus
extern "C" {
#endif


#if !defined(niimaqdx_types)
#define niimaqdx_types

#ifdef _CVI_
    #pragma  EnableLibraryRuntimeChecking
#endif

//==============================================================================
//  Typedefs
//==============================================================================
#ifndef _NI_uInt8_DEFINED_
    #define _NI_uInt8_DEFINED_
    typedef unsigned char       uInt8;
#endif

#ifndef _NI_uInt16_DEFINED_
    #define _NI_uInt16_DEFINED_
    typedef unsigned short int  uInt16;
#endif

#ifndef _NI_uInt32_DEFINED_
    #define _NI_uInt32_DEFINED_
    #if defined(_MSC_VER)
        typedef unsigned long       uInt32;
    #elif __GNUC__
        #if __x86_64__
            typedef unsigned int    uInt32;
        #else
            typedef unsigned long   uInt32;
        #endif
    #endif
#endif

#ifndef _NI_uInt64_DEFINED_
    #define _NI_uInt64_DEFINED_
    #if defined(_MSC_VER) || _CVI_ >= 700
        typedef unsigned __int64    uInt64;
    #elif __GNUC__
        typedef unsigned long long  uInt64;
    #endif
#endif

#ifndef _NI_Int8_DEFINED_
    #define _NI_Int8_DEFINED_
    typedef char                Int8;
#endif

#ifndef _NI_Int16_DEFINED_
    #define _NI_Int16_DEFINED_
    typedef short int           Int16;
#endif

#ifndef _NI_Int32_DEFINED_
    #define _NI_Int32_DEFINED_
    #if defined(_MSC_VER)
        typedef long            Int32;
    #elif __GNUC__
        #if __x86_64__
            typedef int         Int32;
        #else
            typedef long        Int32;
        #endif
    #endif
#endif  

#ifndef _NI_Int64_DEFINED_
    #define _NI_Int64_DEFINED_
    #if defined(_MSC_VER) || _CVI_ >= 700
        typedef __int64        Int64;
    #elif __GNUC__
        typedef long long int  Int64;
    #endif
#endif

#ifndef _NI_float32_DEFINED_
    #define _NI_float32_DEFINED_
    typedef float               float32;
#endif

#ifndef _NI_float64_DEFINED_
    #define _NI_float64_DEFINED_
    typedef double              float64;
#endif

#ifndef TRUE
    #define TRUE                (1L)
#endif

#ifndef FALSE
    #define FALSE               (0L)
#endif

#ifndef _NI_GUIDHNDL_DEFINED
    typedef uInt32              GUIHNDL;
#endif

#if (defined(_MSC_VER) || defined(_CVI_))
    #ifndef _NI_FUNC_DEFINED
        #define NI_FUNC         __stdcall
    #endif
    
    #ifndef _NI_FUNCC_DEFINED
        #define NI_FUNCC        __cdecl
    #endif
#elif defined(__GNUC__)
    #ifndef _NI_FUNC_DEFINED
        #define NI_FUNC
    #endif
    
    #ifndef _NI_FUNCC_DEFINED
        #define NI_FUNCC
    #endif
#endif

#ifndef _NI_bool32_DEFINED_
    #define _NI_bool32_DEFINED_
    typedef uInt32              bool32;
#endif

#ifndef _NI_IMAQdxSession_DEFINED_
    #define _NI_IMAQdxSession_DEFINED_
    typedef uInt32              IMAQdxSession;
#endif

#define IMAQDX_MAX_API_STRING_LENGTH 512

//==============================================================================
//  Forward Declare Data Structures
//==============================================================================
typedef struct Image_struct Image;


//==============================================================================
//  Error Codes Enumeration
//==============================================================================
typedef enum IMAQdxError_enum {
    IMAQdxErrorSuccess = 0x0,                   // Success
    IMAQdxErrorSystemMemoryFull = 0xBFF69000,   // Not enough memory
    IMAQdxErrorInternal,                        // Internal error
    IMAQdxErrorInvalidParameter,                // Invalid parameter
    IMAQdxErrorInvalidPointer,                  // Invalid pointer
    IMAQdxErrorInvalidInterface,                // Invalid camera session
    IMAQdxErrorInvalidRegistryKey,              // Invalid registry key
    IMAQdxErrorInvalidAddress,                  // Invalid address
    IMAQdxErrorInvalidDeviceType,               // Invalid device type
    IMAQdxErrorNotImplemented,                  // Not implemented
    IMAQdxErrorCameraNotFound,                  // Camera not found
    IMAQdxErrorCameraInUse,                     // Camera is already in use.
    IMAQdxErrorCameraNotInitialized,            // Camera is not initialized.
    IMAQdxErrorCameraRemoved,                   // Camera has been removed.
    IMAQdxErrorCameraRunning,                   // Acquisition in progress.
    IMAQdxErrorCameraNotRunning,                // No acquisition in progress.
    IMAQdxErrorAttributeNotSupported,           // Attribute not supported by the camera.
    IMAQdxErrorAttributeNotSettable,            // Unable to set attribute.
    IMAQdxErrorAttributeNotReadable,            // Unable to get attribute.
    IMAQdxErrorAttributeOutOfRange,             // Attribute value is out of range.
    IMAQdxErrorBufferNotAvailable,              // Requested buffer is unavailable.
    IMAQdxErrorBufferListEmpty,                 // Buffer list is empty. Add one or more buffers.
    IMAQdxErrorBufferListLocked,                // Buffer list is already locked. Reconfigure acquisition and try again.
    IMAQdxErrorBufferListNotLocked,             // No buffer list. Reconfigure acquisition and try again.
    IMAQdxErrorResourcesAllocated,              // Transfer engine resources already allocated. Reconfigure acquisition and try again.
    IMAQdxErrorResourcesUnavailable,            // Insufficient transfer engine resources.
    IMAQdxErrorAsyncWrite,                      // Unable to perform asychronous register write.
    IMAQdxErrorAsyncRead,                       // Unable to perform asychronous register read.
    IMAQdxErrorTimeout,                         // Timeout.
    IMAQdxErrorBusReset,                        // Bus reset occurred during a transaction.
    IMAQdxErrorInvalidXML,                      // Unable to load camera's XML file.
    IMAQdxErrorFileAccess,                      // Unable to read/write to file.
    IMAQdxErrorInvalidCameraURLString,          // Camera has malformed URL string.
    IMAQdxErrorInvalidCameraFile,               // Invalid camera file.
    IMAQdxErrorGenICamError,                    // Unknown Genicam error.
    IMAQdxErrorFormat7Parameters,               // For format 7: The combination of speed, image position, image size, and color coding is incorrect.
    IMAQdxErrorInvalidAttributeType,            // The attribute type is not compatible with the passed variable type.
    IMAQdxErrorDLLNotFound,                     // The DLL could not be found.
    IMAQdxErrorFunctionNotFound,                // The function could not be found.
    IMAQdxErrorLicenseNotActivated,             // License not activated.
    IMAQdxErrorCameraNotConfiguredForListener,  // The camera is not configured properly to support a listener.
    IMAQdxErrorCameraMulticastNotAvailable,     // Unable to configure the system for multicast support.
    IMAQdxErrorBufferHasLostPackets,            // The requested buffer has lost packets and the user requested an error to be generated.
    IMAQdxErrorGiGEVisionError,                 // Unknown GiGE Vision error.
    IMAQdxErrorNetworkError,                    // Unknown network error.
    IMAQdxErrorCameraUnreachable,               // Unable to connect to the camera.
    IMAQdxErrorHighPerformanceNotSupported,     // High performance acquisition is not supported on the specified network interface. Connect the camera to a network interface running the high performance driver.
    IMAQdxErrorInterfaceNotRenamed,             // Unable to rename interface. Invalid or duplicate name specified.
    IMAQdxErrorNoSupportedVideoModes,           // The camera does not have any video modes which are supported.
    IMAQdxErrorSoftwareTriggerOverrun,          // Software trigger overrun.
    IMAQdxErrorTestPacketNotReceived,           // The system did not receive a test packet from the camera. The packet size may be too large for the network configuration or a firewall may be enabled.
    IMAQdxErrorCorruptedImageReceived,          // The camera returned a corrupted image.
    IMAQdxErrorCameraConfigurationHasChanged,   // The camera did not return an image of the correct type it was configured for previously.
    IMAQdxErrorCameraInvalidAuthentication,     // The camera is configured with password authentication and either the user name and password were not configured or they are incorrect.
    IMAQdxErrorUnknownHTTPError,                // The camera returned an unknown HTTP error.
    IMAQdxErrorKernelDriverUnavailable,         // Unable to attach to the kernel mode driver.
    IMAQdxErrorPixelFormatDecoderUnavailable,   // No decoder available for selected pixel format.
    IMAQdxErrorFirmwareUpdateNeeded,            // The acquisition hardware needs a firmware update before it can be used.
    IMAQdxErrorFirmwareUpdateRebootNeeded,      // The firmware on the acquisition hardware has been updated and the system must be rebooted before use.
    IMAQdxErrorLightingCurrentOutOfRange,       // The requested current level from the lighting controller is not possible.
    IMAQdxErrorUSB3VisionError,                 // Unknown USB3 Vision error.
    IMAQdxErrorInvalidU3VUSBDescriptor,         // The camera has a USB descriptor that is incompatible with the USB3 Vision specification.
    IMAQdxErrorU3VInvalidControlInterface,      // The USB3 Vision control interface is not implemented or is invalid on this camera.
    IMAQdxErrorU3VControlInterfaceError,        // There was an error from the control interface of the USB3 Vision camera.
    IMAQdxErrorU3VInvalidEventInterface,        // The USB3 Vision event interface is not implemented or is invalid on this camera.
    IMAQdxErrorU3VEventInterfaceError,          // There was an error from the event interface of the USB3 Vision camera.
    IMAQdxErrorU3VInvalidStreamInterface,       // The USB3 Vision stream interface is not implemented or is invalid on this camera.
    IMAQdxErrorU3VStreamInterfaceError,         // There was an error from the stream interface of the USB3 Vision camera.
    IMAQdxErrorU3VUnsupportedConnectionSpeed,   // The USB connection speed is not supported by the camera.  Check whether the camera is plugged into a USB 2.0 port instead of a USB 3.0 port.  If so, verify that the camera supports this use case.       
    IMAQdxErrorU3VInsufficientPower,            // The USB3 Vision camera requires more current than can be supplied by the USB port in use.
    IMAQdxErrorU3VInvalidMaxCurrent,            // The U3V_MaximumCurrentUSB20_mA registry value is not valid for the connected USB3 Vision camera.
    IMAQdxErrorBufferIncompleteData,            // The requested buffer has incomplete data and the user requested an error to be generated.
    IMAQdxErrorCameraAcquisitionConfigFailed,   // The camera returned an error starting the acquisition.
    IMAQdxErrorCameraClosePending,              // The camera still has outstanding references and will be closed when these operations complete.
    IMAQdxErrorSoftwareFault,                   // An unexpected software error occurred.
    IMAQdxErrorCameraPropertyInvalid,           // The value for an invalid camera property was requested.
    IMAQdxErrorJumboFramesNotEnabled,           // Jumbo frames are not enabled on the host.  Maximum packet size is 1500 bytes.
    IMAQdxErrorBayerPixelFormatNotSelected,     // This operation requires that the camera has a Bayer pixel format selected.
    IMAQdxErrorGuard = 0xFFFFFFFF,
} IMAQdxError;


//==============================================================================
//  Bus Type Enumeration
//==============================================================================
typedef enum IMAQdxBusType_enum {
    IMAQdxBusTypeFireWire = 0x31333934,
    IMAQdxBusTypeEthernet = 0x69707634,
    IMAQdxBusTypeSimulator = 0x2073696D,
    IMAQdxBusTypeDirectShow = 0x64736877,
    IMAQdxBusTypeIP = 0x4950636D,
    IMAQdxBusTypeSmartCam2 = 0x53436132,
    IMAQdxBusTypeUSB3Vision = 0x55534233,
    IMAQdxBusTypeUVC = 0x55564320,
    IMAQdxBusTypeGuard = 0xFFFFFFFF,
} IMAQdxBusType;


//==============================================================================
//  Camera Control Mode Enumeration
//==============================================================================
typedef enum IMAQdxCameraControlMode_enum {
    IMAQdxCameraControlModeController,
    IMAQdxCameraControlModeListener,
    IMAQdxCameraControlModeGuard = 0xFFFFFFFF,
} IMAQdxCameraControlMode;


//==============================================================================
//  Buffer Number Mode Enumeration
//==============================================================================
typedef enum IMAQdxBufferNumberMode_enum {
    IMAQdxBufferNumberModeNext,
    IMAQdxBufferNumberModeLast,
    IMAQdxBufferNumberModeBufferNumber,
    IMAQdxBufferNumberModeGuard = 0xFFFFFFFF,
} IMAQdxBufferNumberMode;


//==============================================================================
//  Plug n Play Event Enumeration
//==============================================================================
typedef enum IMAQdxPnpEvent_enum {
    IMAQdxPnpEventCameraAttached,
    IMAQdxPnpEventCameraDetached,
    IMAQdxPnpEventBusReset,
    IMAQdxPnpEventGuard = 0xFFFFFFFF,
} IMAQdxPnpEvent;


//==============================================================================
//  Bayer Pattern Enumeration
//==============================================================================
typedef enum IMAQdxBayerPattern_enum {
    IMAQdxBayerPatternNone,
    IMAQdxBayerPatternGB,
    IMAQdxBayerPatternGR,
    IMAQdxBayerPatternBG,
    IMAQdxBayerPatternRG,
    IMAQdxBayerPatternHardware,
    IMAQdxBayerPatternGuard = 0xFFFFFFFF,
} IMAQdxBayerPattern;


//==============================================================================
//  Bayer Decode Algorithm Enumeration
//==============================================================================
typedef enum IMAQdxBayerAlgorithm_enum {
    IMAQdxBayerAlgorithmBilinear,
    IMAQdxBayerAlgorithmVNG,
    IMAQdxBayerAlgorithmGuard = 0xFFFFFFFF,
} IMAQdxBayerAlgorithm;


//==============================================================================
//  Output Image Types -- Values match Vision Development Module image types
//==============================================================================
typedef enum IMAQdxOutputImageType_enum {
    IMAQdxOutputImageTypeU8    = 0,
    IMAQdxOutputImageTypeI16   = 1,
    IMAQdxOutputImageTypeU16   = 7,
    IMAQdxOutputImageTypeRGB32 = 4,
    IMAQdxOutputImageTypeRGB64 = 6,
    IMAQdxOutputImageTypeAuto  = 0x7FFFFFFF,
    IMAQdxOutputImageTypeGuard = 0xFFFFFFFF,
} IMAQdxOutputImageType;


//==============================================================================
//  Controller Destination Mode Enumeration
//==============================================================================
typedef enum IMAQdxDestinationMode_enum {
    IMAQdxDestinationModeUnicast,
    IMAQdxDestinationModeBroadcast,
    IMAQdxDestinationModeMulticast,
    IMAQdxDestinationModeGuard = 0xFFFFFFFF,
} IMAQdxDestinationMode;


//==============================================================================
//   Attribute Type Enumeration
//==============================================================================
typedef enum IMAQdxAttributeType_enum {    
    IMAQdxAttributeTypeU32,
    IMAQdxAttributeTypeI64,
    IMAQdxAttributeTypeF64,
    IMAQdxAttributeTypeString,
    IMAQdxAttributeTypeEnum,
    IMAQdxAttributeTypeBool,
    IMAQdxAttributeTypeCommand,
    IMAQdxAttributeTypeBlob,
    IMAQdxAttributeTypeGuard = 0xFFFFFFFF,
} IMAQdxAttributeType;


//==============================================================================
//  Value Type Enumeration
//==============================================================================
typedef enum IMAQdxValueType_enum {    
    IMAQdxValueTypeU32,
    IMAQdxValueTypeI64,
    IMAQdxValueTypeF64,
    IMAQdxValueTypeString,
    IMAQdxValueTypeEnumItem,
    IMAQdxValueTypeBool,
    IMAQdxValueTypeDisposableString,
    IMAQdxValueTypeGuard = 0xFFFFFFFF,
} IMAQdxValueType;


//==============================================================================
//  Interface File Flags Enumeration
//==============================================================================
typedef enum IMAQdxInterfaceFileFlags_enum {
    IMAQdxInterfaceFileFlagsConnected = 0x1,
    IMAQdxInterfaceFileFlagsDirty = 0x2,
    IMAQdxInterfaceFileFlagsGuard = 0xFFFFFFFF,
} IMAQdxInterfaceFileFlags;


//==============================================================================
//  Overwrite Mode Enumeration
//==============================================================================
typedef enum IMAQdxOverwriteMode_enum {
    IMAQdxOverwriteModeGetOldest = 0x0,
    IMAQdxOverwriteModeFail = 0x2,
    IMAQdxOverwriteModeGetNewest = 0x3,
    IMAQdxOverwriteModeGuard = 0xFFFFFFFF,
} IMAQdxOverwriteMode;


//==============================================================================
//  Incomplete Buffer Mode Enumeration
//==============================================================================
typedef enum IMAQdxIncompleteBufferMode_enum {
    IMAQdxIncompleteBufferModeIgnore,
    IMAQdxIncompleteBufferModeFail,
    IMAQdxIncompleteBufferModeGuard = 0xFFFFFFFF,
} IMAQdxIncompleteBufferMode;


//==============================================================================
//  Lost Packet Mode Enumeration
//==============================================================================
typedef enum IMAQdxLostPacketMode_enum {
    IMAQdxLostPacketModeIgnore,
    IMAQdxLostPacketModeFail,
    IMAQdxLostPacketModeGuard = 0xFFFFFFFF,
} IMAQdxLostPacketMode;


//==============================================================================
//  Attribute Visibility Enumeration
//==============================================================================
typedef enum IMAQdxAttributeVisibility_enum {
    IMAQdxAttributeVisibilitySimple = 0x00001000,
    IMAQdxAttributeVisibilityIntermediate = 0x00002000,
    IMAQdxAttributeVisibilityAdvanced = 0x00004000,
    IMAQdxAttributeVisibilityGuard = 0xFFFFFFFF,
} IMAQdxAttributeVisibility;


//==============================================================================
//  Stream Channel Mode Enumeration
//==============================================================================
typedef enum IMAQdxStreamChannelMode_enum {
    IMAQdxStreamChannelModeAutomatic,
    IMAQdxStreamChannelModeManual,
    IMAQdxStreamChannelModeGuard = 0xFFFFFFFF,
} IMAQdxStreamChannelMode;


//==============================================================================
//  Pixel Signedness Enumeration
//==============================================================================
typedef enum IMAQdxPixelSignedness_enum {
    IMAQdxPixelSignednessUnsigned,
    IMAQdxPixelSignednessSigned,
    IMAQdxPixelSignednessHardware,
    IMAQdxPixelSignednessGuard = 0xFFFFFFFF,
} IMAQdxPixelSignedness;


//==============================================================================
//  USB Connection Speed Enumeration
//==============================================================================
typedef enum IMAQdxUSBConnectionSpeed_enum {
    IMAQdxUSBConnectionSpeedLow = 1,
    IMAQdxUSBConnectionSpeedFull = 2,
    IMAQdxUSBConnectionSpeedHigh = 4,
    IMAQdxUSBConnectionSpeedSuper = 8,
    IMAQdxUSBConnectionSpeedGuard = 0xFFFFFFFF,
} IMAQdxUSBConnectionSpeed;


//==============================================================================
//  CVI Structures
//==============================================================================
#pragma pack(push, 4)


//==============================================================================
//  Camera Information Structure
//==============================================================================
typedef struct IMAQdxCameraInformation_struct {
    uInt32 Type;
    uInt32 Version;
    uInt32 Flags;
    uInt32 SerialNumberHi;
    uInt32 SerialNumberLo;
    IMAQdxBusType BusType;
    char InterfaceName[IMAQDX_MAX_API_STRING_LENGTH];
    char VendorName[IMAQDX_MAX_API_STRING_LENGTH];
    char ModelName[IMAQDX_MAX_API_STRING_LENGTH];
    char CameraFileName[IMAQDX_MAX_API_STRING_LENGTH];
    char CameraAttributeURL[IMAQDX_MAX_API_STRING_LENGTH];
} IMAQdxCameraInformation;


//==============================================================================
//  Camera File Structure
//==============================================================================
typedef struct IMAQdxCameraFile_struct {
    uInt32 Type;
    uInt32 Version;
    char FileName[IMAQDX_MAX_API_STRING_LENGTH];
} IMAQdxCameraFile;


//==============================================================================
//  Attribute Information Structure
//==============================================================================
typedef struct IMAQdxAttributeInformation_struct {
    IMAQdxAttributeType Type;
    bool32 Readable;
    bool32 Writable;
    char Name[IMAQDX_MAX_API_STRING_LENGTH];
} IMAQdxAttributeInformation;


//==============================================================================
//  Enumeration Item Structure
//==============================================================================
typedef struct IMAQdxEnumItem_struct {
    uInt32 Value;
    uInt32 Reserved;
    char Name[IMAQDX_MAX_API_STRING_LENGTH];
} IMAQdxEnumItem;


//==============================================================================
//  Camera Information Structure
//==============================================================================
typedef IMAQdxEnumItem IMAQdxVideoMode;


#pragma pack(pop)


//==============================================================================
//  Callbacks
//==============================================================================
typedef     uInt32 (NI_FUNC *FrameDoneEventCallbackPtr)(IMAQdxSession id, uInt32 bufferNumber, void* callbackData);
typedef     uInt32 (NI_FUNC *PnpEventCallbackPtr)(IMAQdxSession id, IMAQdxPnpEvent pnpEvent, void* callbackData);
typedef     void (NI_FUNC *AttributeUpdatedEventCallbackPtr)(IMAQdxSession id, const char* name, void* callbackData);

#endif //niimaqdx_types
//==============================================================================
//  Attributes
//==============================================================================
#define IMAQdxAttributeBaseAddress               "CameraInformation::BaseAddress"         // Read only. Gets the base address of the camera registers.
#define IMAQdxAttributeBusType                   "CameraInformation::BusType"             // Read only. Gets the bus type of the camera.
#define IMAQdxAttributeModelName                 "CameraInformation::ModelName"           // Read only. Returns the model name.
#define IMAQdxAttributeSerialNumberHigh          "CameraInformation::SerialNumberHigh"    // Read only. Gets the upper 32-bits of the camera 64-bit serial number.
#define IMAQdxAttributeSerialNumberLow           "CameraInformation::SerialNumberLow"     // Read only. Gets the lower 32-bits of the camera 64-bit serial number.
#define IMAQdxAttributeVendorName                "CameraInformation::VendorName"          // Read only. Returns the vendor name.
#define IMAQdxAttributeHostIPAddress             "CameraInformation::HostIPAddress"       // Read only. Returns the host adapter IP address.
#define IMAQdxAttributeIPAddress                 "CameraInformation::IPAddress"           // Read only. Returns the IP address.
#define IMAQdxAttributePrimaryURLString          "CameraInformation::PrimaryURLString"    // Read only. Gets the camera's primary URL string.
#define IMAQdxAttributeSecondaryURLString        "CameraInformation::SecondaryURLString"  // Read only. Gets the camera's secondary URL string.
#define IMAQdxAttributeAcqInProgress             "StatusInformation::AcqInProgress"       // Read only. Gets the current state of the acquisition. TRUE if acquiring; otherwise FALSE.
#define IMAQdxAttributeLastBufferCount           "StatusInformation::LastBufferCount"     // Read only. Gets the number of transferred buffers.
#define IMAQdxAttributeLastBufferNumber          "StatusInformation::LastBufferNumber"    // Read only. Gets the last cumulative buffer number transferred.
#define IMAQdxAttributeLostBufferCount           "StatusInformation::LostBufferCount"     // Read only. Gets the number of lost buffers during an acquisition session.
#define IMAQdxAttributeLostPacketCount           "StatusInformation::LostPacketCount"     // Read only. Gets the number of lost packets during an acquisition session.
#define IMAQdxAttributeRequestedResendPackets    "StatusInformation::RequestedResendPacketCount" // Read only. Gets the number of packets requested to be resent during an acquisition session.
#define IMAQdxAttributeReceivedResendPackets     "StatusInformation::ReceivedResendPackets" // Read only. Gets the number of packets that were requested to be resent during an acquisition session and were completed.
#define IMAQdxAttributeHandledEventCount         "StatusInformation::HandledEventCount"   // Read only. Gets the number of handled events during an acquisition session.
#define IMAQdxAttributeLostEventCount            "StatusInformation::LostEventCount"      // Read only. Gets the number of lost events during an acquisition session.
#define IMAQdxAttributeBayerGainB                "AcquisitionAttributes::Bayer::GainB"    // Sets/gets the white balance gain for the blue component of the Bayer conversion.
#define IMAQdxAttributeBayerGainG                "AcquisitionAttributes::Bayer::GainG"    // Sets/gets the white balance gain for the green component of the Bayer conversion.
#define IMAQdxAttributeBayerGainR                "AcquisitionAttributes::Bayer::GainR"    // Sets/gets the white balance gain for the red component of the Bayer conversion.
#define IMAQdxAttributeBayerPattern              "AcquisitionAttributes::Bayer::Pattern"  // Sets/gets the Bayer pattern to use.
#define IMAQdxAttributeStreamChannelMode         "AcquisitionAttributes::Controller::StreamChannelMode" // Gets/sets the mode for allocating a FireWire stream channel.
#define IMAQdxAttributeDesiredStreamChannel      "AcquisitionAttributes::Controller::DesiredStreamChannel" // Gets/sets the stream channel to manually allocate.
#define IMAQdxAttributeFrameInterval             "AcquisitionAttributes::FrameInterval"   // Read only. Gets the duration in milliseconds between successive frames.
#define IMAQdxAttributeIgnoreFirstFrame          "AcquisitionAttributes::IgnoreFirstFrame" // Gets/sets the video delay of one frame between starting the camera and receiving the video feed.
#define IMAQdxAttributeOffsetX                   "OffsetX"                                // Gets/sets the left offset of the image.
#define IMAQdxAttributeOffsetY                   "OffsetY"                                // Gets/sets the top offset of the image.
#define IMAQdxAttributeWidth                     "Width"                                  // Gets/sets the width of the image.
#define IMAQdxAttributeHeight                    "Height"                                 // Gets/sets the height of the image.
#define IMAQdxAttributePixelFormat               "PixelFormat"                            // Gets/sets the pixel format of the source sensor.
#define IMAQdxAttributePacketSize                "PacketSize"                             // Gets/sets the packet size in bytes.
#define IMAQdxAttributePayloadSize               "PayloadSize"                            // Gets/sets the frame size in bytes.
#define IMAQdxAttributeSpeed                     "AcquisitionAttributes::Speed"           // Gets/sets the transfer speed in Mbps for a FireWire packet.
#define IMAQdxAttributeShiftPixelBits            "AcquisitionAttributes::ShiftPixelBits"  // Gets/sets the alignment of 16-bit cameras. Downshift the pixel bits if the camera returns most significant bit-aligned data.
#define IMAQdxAttributeSwapPixelBytes            "AcquisitionAttributes::SwapPixelBytes"  // Gets/sets the endianness of 16-bit cameras. Swap the pixel bytes if the camera returns little endian data.
#define IMAQdxAttributeOverwriteMode             "AcquisitionAttributes::OverwriteMode"   // Gets/sets the overwrite mode, used to determine acquisition when an image transfer cannot be completed due to an overwritten internal buffer.
#define IMAQdxAttributeTimeout                   "AcquisitionAttributes::Timeout"         // Gets/sets the timeout value in milliseconds, used to abort an acquisition when the image transfer cannot be completed within the delay.
#define IMAQdxAttributeVideoMode                 "AcquisitionAttributes::VideoMode"       // Gets/sets the video mode for a camera.
#define IMAQdxAttributeBitsPerPixel              "AcquisitionAttributes::BitsPerPixel"    // Gets/sets the actual bits per pixel. For 16-bit components, this represents the actual bit depth (10-, 12-, 14-, or 16-bit).
#define IMAQdxAttributePixelSignedness           "AcquisitionAttributes::PixelSignedness" // Gets/sets the signedness of the pixel. For 16-bit components, this represents the actual pixel signedness (Signed, or Unsigned).
#define IMAQdxAttributeReserveDualPackets        "AcquisitionAttributes::ReserveDualPackets" // Gets/sets if dual packets will be reserved for a very large FireWire packet.
#define IMAQdxAttributeReceiveTimestampMode      "AcquisitionAttributes::ReceiveTimestampMode" // Gets/sets the mode for timestamping images received by the driver.
#define IMAQdxAttributeActualPeakBandwidth       "AcquisitionAttributes::AdvancedEthernet::BandwidthControl::ActualPeakBandwidth" // Read only. Returns the actual maximum peak bandwidth the camera will be configured to use.
#define IMAQdxAttributeDesiredPeakBandwidth      "AcquisitionAttributes::AdvancedEthernet::BandwidthControl::DesiredPeakBandwidth" // Gets/sets the desired maximum peak bandwidth the camera should use.
#define IMAQdxAttributeDestinationMode           "AcquisitionAttributes::AdvancedEthernet::Controller::DestinationMode" // Gets/Sets where the camera is instructed to send the image stream.
#define IMAQdxAttributeDestinationMulticastAddress "AcquisitionAttributes::AdvancedEthernet::Controller::DestinationMulticastAddress" // Gets/Sets the multicast address the camera should send data in multicast mode.
#define IMAQdxAttributeEventsEnabled             "AcquisitionAttributes::AdvancedEthernet::EventParameters::EventsEnabled" // Gets/Sets if events will be handled.
#define IMAQdxAttributeMaxOutstandingEvents      "AcquisitionAttributes::AdvancedEthernet::EventParameters::MaxOutstandingEvents" // Gets/Sets the maximum number of outstanding events to queue.
#define IMAQdxAttributeTestPacketEnabled         "AcquisitionAttributes::AdvancedEthernet::TestPacketParameters::TestPacketEnabled" // Gets/Sets whether the driver will validate the image streaming settings using test packets prior to an acquisition
#define IMAQdxAttributeTestPacketTimeout         "AcquisitionAttributes::AdvancedEthernet::TestPacketParameters::TestPacketTimeout" // Gets/Sets the timeout for validating test packet reception (if enabled)
#define IMAQdxAttributeMaxTestPacketRetries      "AcquisitionAttributes::AdvancedEthernet::TestPacketParameters::MaxTestPacketRetries" // Gets/Sets the number of retries for validating test packet reception (if enabled)
#define IMAQdxAttributeChunkDataDecodingEnabled  "AcquisitionAttributes::ChunkDataDecoding::ChunkDataDecodingEnabled" // Gets/Sets whether the driver will decode any chunk data in the image stream
#define IMAQdxAttributeChunkDataDecodingMaxElementSize "AcquisitionAttributes::ChunkDataDecoding::MaximumChunkCopySize" // Gets/Sets the maximum size of any single chunk data element that will be made available
#define IMAQdxAttributeLostPacketMode            "AcquisitionAttributes::AdvancedEthernet::LostPacketMode" // Gets/sets the behavior when the user extracts a buffer that has missing packets.
#define IMAQdxAttributeMemoryWindowSize          "AcquisitionAttributes::AdvancedEthernet::ResendParameters::MemoryWindowSize" // Gets/sets the size of the memory window of the camera in kilobytes. Should match the camera's internal buffer size.
#define IMAQdxAttributeResendsEnabled            "AcquisitionAttributes::AdvancedEthernet::ResendParameters::ResendsEnabled" // Gets/sets if resends will be issued for missing packets.
#define IMAQdxAttributeResendThresholdPercentage "AcquisitionAttributes::AdvancedEthernet::ResendParameters::ResendThresholdPercentage" // Gets/sets the threshold of the packet processing window that will trigger packets to be resent.
#define IMAQdxAttributeResendBatchingPercentage  "AcquisitionAttributes::AdvancedEthernet::ResendParameters::ResendBatchingPercentage" // Gets/sets the percent of the packet resend threshold that will be issued as one group past the initial threshold sent in a single request.
#define IMAQdxAttributeMaxResendsPerPacket       "AcquisitionAttributes::AdvancedEthernet::ResendParameters::MaxResendsPerPacket" // Gets/sets the maximum number of resend requests that will be issued for a missing packet.
#define IMAQdxAttributeResendResponseTimeout     "AcquisitionAttributes::AdvancedEthernet::ResendParameters::ResendResponseTimeout" // Gets/sets the time to wait for a resend request to be satisfied before sending another.
#define IMAQdxAttributeNewPacketTimeout          "AcquisitionAttributes::AdvancedEthernet::ResendParameters::NewPacketTimeout" // Gets/sets the time to wait for new packets to arrive in a partially completed image before assuming the rest of the image was lost.
#define IMAQdxAttributeMissingPacketTimeout      "AcquisitionAttributes::AdvancedEthernet::ResendParameters::MissingPacketTimeout" // Gets/sets the time to wait for a missing packet before issuing a resend.
#define IMAQdxAttributeResendTimerResolution     "AcquisitionAttributes::AdvancedEthernet::ResendParameters::ResendTimerResolution" // Gets/sets the resolution of the packet processing system that is used for all packet-related timeouts.


//==============================================================================
//  Functions
//==============================================================================
IMAQdxError NI_FUNC IMAQdxSnap(IMAQdxSession id, Image* image);
IMAQdxError NI_FUNC IMAQdxConfigureGrab(IMAQdxSession id);
IMAQdxError NI_FUNC IMAQdxGrab(IMAQdxSession id, Image* image, bool32 waitForNextBuffer, uInt32* actualBufferNumber);
IMAQdxError NI_FUNC IMAQdxSequence(IMAQdxSession id, Image* images[], uInt32 count);
IMAQdxError NI_FUNC IMAQdxDiscoverEthernetCameras(const char* address, uInt32 timeout);
IMAQdxError NI_FUNC IMAQdxEnumerateCameras(IMAQdxCameraInformation cameraInformationArray[], uInt32* count, bool32 connectedOnly);
IMAQdxError NI_FUNC IMAQdxResetCamera(const char* name, bool32 resetAll);
IMAQdxError NI_FUNC IMAQdxOpenCamera(const char* name, IMAQdxCameraControlMode mode, IMAQdxSession* id);
IMAQdxError NI_FUNC IMAQdxCloseCamera(IMAQdxSession id);
IMAQdxError NI_FUNC IMAQdxConfigureAcquisition(IMAQdxSession id, bool32 continuous, uInt32 bufferCount);
IMAQdxError NI_FUNC IMAQdxStartAcquisition(IMAQdxSession id);
IMAQdxError NI_FUNC IMAQdxGetImage(IMAQdxSession id, Image* image, IMAQdxBufferNumberMode mode, uInt32 desiredBufferNumber, uInt32* actualBufferNumber);
IMAQdxError NI_FUNC IMAQdxGetImageData(IMAQdxSession id, void* buffer, uInt32 bufferSize, IMAQdxBufferNumberMode mode, uInt32 desiredBufferNumber, uInt32* actualBufferNumber);
IMAQdxError NI_FUNC IMAQdxStopAcquisition(IMAQdxSession id);
IMAQdxError NI_FUNC IMAQdxUnconfigureAcquisition(IMAQdxSession id);
IMAQdxError NI_FUNC IMAQdxEnumerateVideoModes(IMAQdxSession id, IMAQdxVideoMode videoModeArray[], uInt32* count, uInt32* currentMode);
IMAQdxError NI_FUNC IMAQdxEnumerateAttributes(IMAQdxSession id, IMAQdxAttributeInformation attributeInformationArray[], uInt32* count, const char* root);
IMAQdxError NI_FUNC IMAQdxGetAttribute(IMAQdxSession id, const char* name, IMAQdxValueType type, void* value);
IMAQdxError NI_FUNCC IMAQdxSetAttribute(IMAQdxSession id, const char* name, IMAQdxValueType type, ...);
IMAQdxError NI_FUNC IMAQdxGetAttributeMinimum(IMAQdxSession id, const char* name, IMAQdxValueType type, void* value);
IMAQdxError NI_FUNC IMAQdxGetAttributeMaximum(IMAQdxSession id, const char* name, IMAQdxValueType type, void* value);
IMAQdxError NI_FUNC IMAQdxGetAttributeIncrement(IMAQdxSession id, const char* name, IMAQdxValueType type, void* value);
IMAQdxError NI_FUNC IMAQdxGetAttributeType(IMAQdxSession id, const char* name, IMAQdxAttributeType* type);
IMAQdxError NI_FUNC IMAQdxIsAttributeReadable(IMAQdxSession id, const char* name, bool32* readable);
IMAQdxError NI_FUNC IMAQdxIsAttributeWritable(IMAQdxSession id, const char* name, bool32* writable);
IMAQdxError NI_FUNC IMAQdxEnumerateAttributeValues(IMAQdxSession id, const char* name, IMAQdxEnumItem list[], uInt32* size);
IMAQdxError NI_FUNC IMAQdxGetAttributeTooltip(IMAQdxSession id, const char* name, char* tooltip, uInt32 length);
IMAQdxError NI_FUNC IMAQdxGetAttributeUnits(IMAQdxSession id, const char* name, char* units, uInt32 length);
IMAQdxError NI_FUNC IMAQdxRegisterFrameDoneEvent(IMAQdxSession id, uInt32 bufferInterval, FrameDoneEventCallbackPtr callbackFunction, void* callbackData);
IMAQdxError NI_FUNC IMAQdxRegisterPnpEvent(IMAQdxSession id, IMAQdxPnpEvent event, PnpEventCallbackPtr callbackFunction, void* callbackData);
IMAQdxError NI_FUNC IMAQdxWriteRegister(IMAQdxSession id, uInt32 offset, uInt32 value);
IMAQdxError NI_FUNC IMAQdxReadRegister(IMAQdxSession id, uInt32 offset, uInt32* value);
IMAQdxError NI_FUNC IMAQdxWriteMemory(IMAQdxSession id, uInt32 offset, const char* values, uInt32 count);
IMAQdxError NI_FUNC IMAQdxReadMemory(IMAQdxSession id, uInt32 offset, char* values, uInt32 count);
IMAQdxError NI_FUNC IMAQdxGetErrorString(IMAQdxError error, char* message, uInt32 messageLength);
IMAQdxError NI_FUNC IMAQdxWriteAttributes(IMAQdxSession id, const char* filename);
IMAQdxError NI_FUNC IMAQdxReadAttributes(IMAQdxSession id, const char* filename);
IMAQdxError NI_FUNC IMAQdxResetEthernetCameraAddress(const char* name, const char* address, const char* subnet, const char* gateway, uInt32 timeout);
IMAQdxError NI_FUNC IMAQdxEnumerateAttributes2(IMAQdxSession id, IMAQdxAttributeInformation attributeInformationArray[], uInt32* count, const char* root, IMAQdxAttributeVisibility visibility);
IMAQdxError NI_FUNC IMAQdxGetAttributeVisibility(IMAQdxSession id, const char* name, IMAQdxAttributeVisibility* visibility);
IMAQdxError NI_FUNC IMAQdxGetAttributeDescription(IMAQdxSession id, const char* name, char* description, uInt32 length);
IMAQdxError NI_FUNC IMAQdxGetAttributeDisplayName(IMAQdxSession id, const char* name, char* displayName, uInt32 length);
IMAQdxError NI_FUNC IMAQdxDispose(void* buffer);
IMAQdxError NI_FUNC IMAQdxRegisterAttributeUpdatedEvent(IMAQdxSession id, const char* name, AttributeUpdatedEventCallbackPtr callbackFunction, void* callbackData);
IMAQdxError NI_FUNC IMAQdxEnumerateAttributes3(IMAQdxSession id, IMAQdxAttributeInformation attributeInformationArray[], uInt32* count, const char* root, IMAQdxAttributeVisibility visibility);


#ifdef __cplusplus
}
#endif


#endif // ___niimaqdx_h___
