Files
2024-05-18 23:53:26 +08:00

455 lines
18 KiB
C++

#ifndef _SAPACQUISITION_H_
#define _SAPACQUISITION_H_
// SapAcquisition.h : header file
//
#include "SapClassBasicDef.h"
#include "SapBuffer.h"
#define ACQCFG_DEFAULT_EXTENSION "ccf"
#define ACQCFG_DEFAULT_FOLDER "\\CamFiles\\User"
#define ACQCFG_SECTION_BOARD "Board"
#define ACQCFG_KEY_SERVER_NAME "Server Name"
#define ACQCFG_KEY_DEVICE_NAME "Device Name"
#define ACQCFG_KEY_DEVICE_INDEX "Device Index"
#define ACQCFG_SECTION_CUSTOM_PARAM "Custom Parameters"
#define ACQCFG_CUSTOM_PARAM_ENTRY "Parameter_%d"
#define ACQCFG_CUSTOM_PARAM_DEFAULT "0,0,0,No Parameter"
#if COR_LINUX
#define ACQCFG_CUSTOM_PARAM_FORMAT "%i,%i,%i"
#else
#define ACQCFG_CUSTOM_PARAM_FORMAT "%li,%li,%li"
#endif
//
// SapAcquisition class declaration
//
// Forward declarations
class SAPCLASSBASIC_CLASS SapAcqCallbackInfo;
typedef void (*SapAcqCallback)(SapAcqCallbackInfo *);
class SAPCLASSBASIC_CLASS SapAcquisition : public SapXferNode
{
public:
// Acquisition event types
typedef UINT64 EventType; // For compatibility with old Sapera++ application code
static const EventType EventNone = 0;
static const EventType EventShaftEncoderReverseCountOverflow = CORACQ_VAL_EVENT_TYPE_SHAFT_ENCODER_REVERSE_COUNT_OVERFLOW;
static const EventType EventLineTriggerTooFast = CORACQ_VAL_EVENT_TYPE_LINE_TRIGGER_TOO_FAST;
static const EventType EventLinkError = CORACQ_VAL_EVENT_TYPE_LINK_ERROR;
static const EventType EventVerticalTimeout = CORACQ_VAL_EVENT_TYPE_VERTICAL_TIMEOUT;
static const EventType EventExternalTrigger2 = CORACQ_VAL_EVENT_TYPE_EXTERNAL_TRIGGER2;
static const EventType EventVirtualFrame = CORACQ_VAL_EVENT_TYPE_VIRTUAL_FRAME;
static const EventType EventUserDefine = CORACQ_VAL_EVENT_TYPE_USER_DEFINE;
static const EventType EventExternalTriggerTooSlow = CORACQ_VAL_EVENT_TYPE_EXT_LINE_TRIGGER_TOO_SLOW;
static const EventType EventExtLineTriggerTooSlow = CORACQ_VAL_EVENT_TYPE_EXT_LINE_TRIGGER_TOO_SLOW;
static const EventType EventHsyncLock = CORACQ_VAL_EVENT_TYPE_HSYNC_LOCK;
static const EventType EventHsyncUnlock = CORACQ_VAL_EVENT_TYPE_HSYNC_UNLOCK;
static const EventType EventExternalTriggerIgnored = CORACQ_VAL_EVENT_TYPE_EXTERNAL_TRIGGER_IGNORED;
static const EventType EventDataOverflow = CORACQ_VAL_EVENT_TYPE_DATA_OVERFLOW;
static const EventType EventFrameLost = CORACQ_VAL_EVENT_TYPE_FRAME_LOST;
static const EventType EventStartOfField = CORACQ_VAL_EVENT_TYPE_START_OF_FIELD;
static const EventType EventStartOfOdd = CORACQ_VAL_EVENT_TYPE_START_OF_ODD;
static const EventType EventStartOfEven = CORACQ_VAL_EVENT_TYPE_START_OF_EVEN;
static const EventType EventStartOfFrame = CORACQ_VAL_EVENT_TYPE_START_OF_FRAME;
static const EventType EventEndOfField = CORACQ_VAL_EVENT_TYPE_END_OF_FIELD;
static const EventType EventEndOfOdd = CORACQ_VAL_EVENT_TYPE_END_OF_ODD;
static const EventType EventEndOfEven = CORACQ_VAL_EVENT_TYPE_END_OF_EVEN;
static const EventType EventEndOfFrame = CORACQ_VAL_EVENT_TYPE_END_OF_FRAME;
static const EventType EventExternalTrigger = CORACQ_VAL_EVENT_TYPE_EXTERNAL_TRIGGER;
static const EventType EventVerticalSync = CORACQ_VAL_EVENT_TYPE_VERTICAL_SYNC;
static const EventType EventEndOfLine = CORACQ_VAL_EVENT_TYPE_END_OF_LINE;
static const EventType EventEndOfNLines = CORACQ_VAL_EVENT_TYPE_END_OF_NLINES;
static const EventType EventNoHSync = CORACQ_VAL_EVENT_TYPE_NO_HSYNC;
static const EventType EventNoVSync = CORACQ_VAL_EVENT_TYPE_NO_VSYNC;
static const EventType EventNoPixelClk = CORACQ_VAL_EVENT_TYPE_NO_PIXEL_CLK;
static const EventType EventPixelClk = CORACQ_VAL_EVENT_TYPE_PIXEL_CLK;
static const EventType EventMask = CORACQ_VAL_EVENT_TYPE_MASK;
static const EventType EventLinkLock = CORACQ_VAL_EVENT_TYPE_LINK_LOCK;
static const EventType EventLinkUnlock = CORACQ_VAL_EVENT_TYPE_LINK_UNLOCK;
static const EventType EventCameraMissedTrigger = CORACQ_VAL_EVENT_TYPE_CAMERA_MISSED_TRIGGER;
static const EventType EventCameraBufferOverrun = CORACQ_VAL_EVENT_TYPE_CAMERA_BUFFER_OVERRUN;
// Software trigger types
typedef int SoftwareTriggerType;
enum _SoftwareTriggerType
{
SoftwareTriggerExt = CORACQ_VAL_SOFTWARE_TRIGGER_EXT,
SoftwareTriggerExtFrame = CORACQ_VAL_SOFTWARE_TRIGGER_EXT_FRAME,
SoftwareTriggerExtLine = CORACQ_VAL_SOFTWARE_TRIGGER_EXT_LINE
};
// Flipping modes
typedef int FlipMode;
enum _FlipMode
{
FlipNone = CORACQ_VAL_FLIP_OFF,
FlipHorizontal = CORACQ_VAL_FLIP_HORZ,
FlipVertical = CORACQ_VAL_FLIP_VERT
};
// Time stamp base
typedef int TimeStampBase;
enum _TimeStampBase
{
TimeStampNone = 0,
TimeStampMicroSec = CORACQ_VAL_TIME_BASE_US,
TimeStampMilliSec = CORACQ_VAL_TIME_BASE_MS,
TimeStampLineValid = CORACQ_VAL_TIME_BASE_LINE_VALID,
TimeStampLineTrigger = CORACQ_VAL_TIME_BASE_LINE_TRIGGER,
TimeStampFrameValid = CORACQ_VAL_TIME_BASE_FRAME_VALID,
TimeStampFrameTrigger = CORACQ_VAL_TIME_BASE_FRAME_TRIGGER,
TimeStampShaftEncoder = CORACQ_VAL_TIME_BASE_SHAFT_ENCODER,
TimeStampNanoSec = CORACQ_VAL_TIME_BASE_NS,
TimeStampPixelClock = CORACQ_VAL_TIME_BASE_PIXEL_CLK,
TimeStamp100NanoSec = CORACQ_VAL_TIME_BASE_100NS
};
// Signal status
typedef int SignalStatus;
enum _SignalStatus
{
SignalNone = 0,
SignalHSyncPresent = CORACQ_VAL_SIGNAL_HSYNC_PRESENT,
SignalVSyncPresent = CORACQ_VAL_SIGNAL_VSYNC_PRESENT,
SignalPixelClkPresent = CORACQ_VAL_SIGNAL_PIXEL_CLK_PRESENT,
SignalChromaPresent = CORACQ_VAL_SIGNAL_CHROMA_PRESENT,
SignalHSyncLock = CORACQ_VAL_SIGNAL_HSYNC_LOCK,
SignalVSyncLock = CORACQ_VAL_SIGNAL_VSYNC_LOCK,
SignalPowerPresent = CORACQ_VAL_SIGNAL_POWER_PRESENT,
SignalPoCLActive = CORACQ_VAL_SIGNAL_POCL_ACTIVE,
SignalPoCLActive2 = CORACQ_VAL_SIGNAL_POCL_ACTIVE_2,
SignalPixelClk1Present = CORACQ_VAL_SIGNAL_PIXEL_CLK_1_PRESENT,
SignalPixelClk2Present = CORACQ_VAL_SIGNAL_PIXEL_CLK_2_PRESENT,
SignalPixelClk3Present = CORACQ_VAL_SIGNAL_PIXEL_CLK_3_PRESENT,
SignalPixelClkAllPresent = CORACQ_VAL_SIGNAL_PIXEL_CLK_ALL_PRESENT,
SignalPixelLinkLock = CORACQ_VAL_SIGNAL_LINK_LOCK,
SignalPixelLane1Lock = CORACQ_VAL_SIGNAL_LANE1_LOCK,
SignalPixelLane2Lock = CORACQ_VAL_SIGNAL_LANE2_LOCK,
SignalPixelLane3Lock = CORACQ_VAL_SIGNAL_LANE3_LOCK,
SignalPixelLane4Lock = CORACQ_VAL_SIGNAL_LANE4_LOCK,
SignalPixelLane5Lock = CORACQ_VAL_SIGNAL_LANE5_LOCK,
SignalPixelLane6Lock = CORACQ_VAL_SIGNAL_LANE6_LOCK,
SignalPixelLane7Lock = CORACQ_VAL_SIGNAL_LANE7_LOCK
};
// Video source scan types
typedef int ScanType;
enum _ScanType
{
ScanArea = CORACQ_VAL_SCAN_AREA,
ScanLine = CORACQ_VAL_SCAN_LINE
};
// Video types
enum VideoType
{
VideoMono = CORACQ_VAL_VIDEO_MONO,
VideoColor = CORACQ_VAL_VIDEO_COLOR,
VideoYC = CORACQ_VAL_VIDEO_YC,
VideoRGB = CORACQ_VAL_VIDEO_RGB,
VideoBayer = CORACQ_VAL_VIDEO_BAYER,
VideoBiColor = CORACQ_VAL_VIDEO_BICOLOR,
VideoRGBY = CORACQ_VAL_VIDEO_RGBY
};
// Image filter kernel sizes
enum ImageFilterKernelSize
{
ImageFilterSize1x1 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_1x1,
ImageFilterSize2x2 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_2x2,
ImageFilterSize3x3 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_3x3,
ImageFilterSize4x4 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_4x4,
ImageFilterSize5x5 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_5x5,
ImageFilterSize6x6 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_6x6,
ImageFilterSize7x7 = CORACQ_VAL_IMAGE_FILTER_KERNEL_SIZE_7x7
};
// Various constants
enum MiscValues
{
MaxCameras = 32,
MaxSerialPortNameSize = 64,
MaxCustomParamSize = 4096
};
public:
// Constructor/Destructor
SapAcquisition(SapLocation location = SapLocation::ServerSystem);
SapAcquisition(SapLocation location, const char *configFile, EventType eventType = EventNone, SapAcqCallback pCallback = NULL, void *pContext = NULL);
SapAcquisition(SapLocation location, const char *camfile, const char *vicfile, EventType eventType = EventNone, SapAcqCallback pCallback = NULL, void *pContext = NULL);
SapAcquisition(const SapAcquisition &acq);
SapAcquisition(const SapAcquisition &acq, EventType eventType, SapAcqCallback pCallback, void* pContext= NULL);
virtual ~SapAcquisition();
SapAcquisition &operator= (const SapAcquisition &acq);
// Creation/destruction
virtual BOOL Create();
virtual BOOL Destroy();
public:
// SapXferNode type information
XferNodeType GetXferNodeType() { return NodeTypeAcquisition; }
// Access to implementation
const char *GetConfigFile() const { return m_CamFile;}
const char *GetCamFile() const { return m_CamFile; }
const char *GetVicFile() const { return m_VicFile; }
const char *GetLabel() const { return m_Label;}
EventType GetEventType() const { return m_EventType; }
SapAcqCallback GetCallback() const { return m_pCallback; }
void *GetContext() const { return m_pContext; }
FlipMode GetFlipMode() const { return m_FlipMode; }
int GetCamSel() const { return m_CamSel; }
virtual BOOL SetConfigFile( const char *configFile);
virtual BOOL SetCamFile(const char *camfile);
virtual BOOL SetVicFile(const char *vicfile);
virtual BOOL SetCallbackInfo( SapAcqCallback pCallback, void *pContext= NULL);
virtual BOOL SetEventType(EventType eventType);
#if COR_LINUX
CORCAM GetCam();
CORVIC GetVic();
#else
CORCAM GetCam() const { return m_hCam; }
CORVIC GetVic() const { return m_hVic; }
#endif
virtual BOOL IsCapabilityValid(int cap);
virtual BOOL IsParameterValid(int param);
virtual BOOL GetCapability(int cap, void *pValue);
virtual BOOL GetParameter(int param, void *pValue);
virtual BOOL SetParameter(int param, int value, BOOL updateNow = TRUE);
virtual BOOL SetParameter(int param, void *pValue, BOOL updateNow = TRUE);
virtual BOOL SetFlipMode(FlipMode flipMode);
virtual BOOL SetCamSel(int camSel);
virtual BOOL SoftwareTrigger(SoftwareTriggerType triggerType);
virtual BOOL SaveParameters(const char *camfile, const char *vicfile);
virtual BOOL SaveParameters(const char *configFile);
// Signal status management
BOOL IsSignalStatusAvailable();
BOOL IsSignalStatusAvailable(SignalStatus signalStatus);
virtual BOOL GetSignalStatus(SignalStatus *pSignalStatus, SapAcqCallback pCallback = NULL, void *pContext = NULL);
virtual BOOL GetSignalStatus(SignalStatus signalStatus, BOOL *pIsActive);
// Callback functionality
BOOL RegisterCallback(EventType eventType, SapAcqCallback callback, void *context = NULL);
BOOL UnregisterCallback();
// Look-up table management
SapLut *GetLut(int lutIndex = 0);
virtual BOOL ApplyLut(BOOL enable = TRUE);
virtual BOOL ApplyLut(BOOL enable, int lutIndex);
virtual BOOL EnableLut(BOOL enable = TRUE);
BOOL CanEnableLut() { return m_LutEnableCap; }
BOOL IsLutEnabled() { return m_LutEnable; }
int GetNumLut() { return m_LutMax; }
// Time stamp management
BOOL IsTimeStampAvailable();
TimeStampBase GetTimeStampBase() const { return m_TimeStampBase; }
virtual BOOL SetTimeStampBase(TimeStampBase timeStampBase);
virtual BOOL ResetTimeStamp();
// Planar input sources management
int GetNumPlanarInputs() const { return m_NumPlanarInputs; }
virtual BOOL GetPlanarInputs(BOOL *pCamEnable);
virtual BOOL SetPlanarInputs(BOOL *pCamEnable, int numCameras);
// Flat field correction management
BOOL IsFlatFieldAvailable() const;
// Bayer conversion management (obsolete)
BOOL IsBayerAvailable() const;
// Color conversion management
BOOL IsColorConversionAvailable() const;
BOOL IsWhiteBalanceAvailable() const;
// Image Filter management
BOOL IsImageFilterAvailable() const { return m_ImageFilterCap; }
BOOL IsImageFilterEnabled();
BOOL EnableImageFilter(BOOL enable = TRUE);
BOOL SetImageFilter(UINT32 filterIndex, SapBuffer *pKernel);
BOOL GetImageFilterKernelSize(UINT32 filterIndex, ImageFilterKernelSize *pKernelSize);
BOOL GetImageFilter(UINT32 filterIndex, SapBuffer *pKernel);
BOOL LoadImageFilter(UINT32 filterIndex, const char *file);
BOOL SaveImageFilter(UINT32 filterIndex, const char *file);
// Dynamic LUT management
BOOL IsDynamicLutAvailable() const;
// Serial port management
BOOL GetSerialPortName(char *serialPortName);
// Commands specific to each acquisition device
BOOL CustomCommand(int command, void *inData, int inDataSize, void *outData, int outDataSize);
protected:
// Utility methods
virtual BOOL CreateRemaining();
virtual BOOL DestroyLut();
virtual void Construct(const char *camfile, const char *vicfile, EventType eventType, SapAcqCallback pCallback, void *pContext);
virtual BOOL LoadConfig();
virtual BOOL LoadCamVic();
virtual BOOL SetCustomParams();
virtual BOOL SetXferParams();
virtual BOOL UpdateLutParams();
virtual BOOL IsLutUpdateNeeded(int param);
virtual BOOL GetParameter(int param, void *pValue, BOOL updateCamVic);
virtual BOOL FixFilePath(const char *originalFilename, char *fullFilePath);
virtual BOOL LoadLut(int lutIndex);
static SAPSTATUS CCONV OnCallback(void *context, UINT32 eventType, UINT32 eventCount);
static SAPSTATUS CCONV OnCallbackEx(void *context, COREVENTINFO eventInfo);
virtual BOOL IsNewCallbackSupported();
// Only use DWORD_PTR starting with Visual Studio .NET 2003, since its presence depends on the
// Platform SDK version with Visual Studio 6, and it is only needed for 64-bit compatibility anyway.
#if (defined(_MSC_VER) && _MSC_VER >= 1300) || defined(POSIX_HOSTPC)
static void CALLBACK TimerProc(UINT timerId, UINT reserved1, DWORD_PTR userData, DWORD_PTR reserved2, DWORD_PTR reserved3);
#else
static void CALLBACK TimerProc(UINT timerId, UINT reserved1, DWORD userData, DWORD reserved2, DWORD reserved3);
#endif
static BOOL IsCameraSignalLost(int initialCameraSignal, int currentCameraSignal);
protected:
// Parameters
char m_CamFile[MAX_PATH]; // CAM file name
char m_VicFile[MAX_PATH]; // VIC file name
char m_Label[MaxLabelSize]; // Name of the acquisition resource
EventType m_EventType; // Type of event for callback
SapAcqCallback m_pCallback; // Application callback function
void *m_pContext; // Application context
// Look-up table management
BOOL m_LutEnableCap;
BOOL m_LutEnable;
int m_LutEntries;
SapFormat m_LutFormat;
int m_LutMax;
SapLut** m_AcqLut;
// Pixel depth and shift for transfer parameters
int m_PixelDepthWithLut;
int m_PixelDepthNoLut;
int m_PixelShiftWithLut;
int m_PixelShiftNoLut;
// Flipping mode management
FlipMode m_FlipModeCap;
FlipMode m_FlipMode;
// Signal status management
SignalStatus m_SignalStatusCap; // Hardware capability
SignalStatus m_SignalStatus; // Current parameter value
SapAcqCallback m_pSignalCallback; // Callback function for parameter value changes
void *m_pSignalContext; // Context information for signal status callback
UINT m_SignalTimerId; // Timer ID for periodic value change checking
// Time stamp management
TimeStampBase m_TimeStampBaseCap;
TimeStampBase m_TimeStampBase;
// Planar input sources management
BOOL m_PlanarInputsCap; // Hardware capability
int m_PlanarInputsMask; // Current parameter value
int m_NumPlanarInputs; // Number of cameras used simultaneously
// Flat field correction management
BOOL m_FlatFieldCap; // Hardware capability
// Color conversion management
BOOL m_ColorConvCap; // Hardware capability
BOOL m_ColorDecoderEnable; // Hardware parameter
BOOL m_WhiteBalanceCap; // Hardware capability
// Image Filter management
BOOL m_ImageFilterCap;
UINT32 m_ImageFilterCount;
// Dynamic LUT management
BOOL m_DynamicLutCap; // Hardware capability
// Management of custom parameters in configuration file
char *m_CustomParamsBuf;
int m_CustomParamsSize;
// Others
CORCAM m_hCam; // Handle to CAM module
CORVIC m_hVic; // Handle to VIC module
BOOL m_bIsCamVicLoaded; // TRUE if CAM/VIC files are loaded
BOOL m_bCallbackRegistered; // TRUE if callback successfully registered
int m_NumPendingParams; // Number of changed parameters no yet written to the acquisition hardware
int m_CamSel; // Camera selector input
BOOL m_NewCallbackSupported; // TRUE if the new callback method is supported
BOOL m_NewCallbackCheckdone; // TRUE if the new callback method check ha sbeen performed
};
//
// SapAcqCallbackInfo class declaration
//
class SAPCLASSBASIC_CLASS SapAcqCallbackInfo
{
public:
SapAcqCallbackInfo(SapAcquisition *pAcq, void *context, SapAcquisition::EventType eventType, int eventCount)
{ m_pAcq = pAcq; m_Context = context; m_EventType = eventType; m_EventCount = eventCount; m_SignalStatus = SapAcquisition::SignalNone; m_NewCallback = FALSE;}
SapAcqCallbackInfo(SapAcquisition *pAcq, void *context, SapAcquisition::SignalStatus signalStatus)
{ m_pAcq = pAcq; m_Context = context; m_EventType = SapAcquisition::EventNone; m_EventCount = 0; m_SignalStatus = signalStatus; m_NewCallback = FALSE;}
SapAcqCallbackInfo(SapAcquisition *pAcq, void *context, COREVENTINFO eventInfo);
~SapAcqCallbackInfo() {}
// Obsolete constructor
SapAcqCallbackInfo(void *context, SapAcquisition::EventType eventType, int eventCount)
{ m_pAcq = NULL; m_Context = context; m_EventType = eventType; m_EventCount = eventCount; m_SignalStatus = SapAcquisition::SignalNone; }
SapAcquisition *GetAcquisition() const { return m_pAcq; }
void *GetContext() const { return m_Context; }
SapAcquisition::SignalStatus GetSignalStatus() const { return m_SignalStatus; }
COREVENTINFO GetEventInfo() const { return m_EventInfo; }
//Event Count
int GetEventCount() const { return m_EventCount; }
BOOL GetEventCount(int *eventCount);
//Event Type
SapAcquisition::EventType GetEventType() const { return m_EventType; }
BOOL GetEventType(SapAcquisition::EventType *eventType);
//Timestamp
BOOL GetHostTimeStamp(UINT64 *hostTimeStamp);
BOOL GetAuxiliaryTimeStamp(UINT64 *auxTimeStamp);
// Custom Parameters
BOOL GetCustomData(void **customData);
BOOL GetCustomSize(int *customSize);
// Unnamed Parameters
BOOL GetGenericParam0(int *paramValue);
BOOL GetGenericParam1(int *paramValue);
BOOL GetGenericParam2(int *paramValue);
BOOL GetGenericParam3(int *paramValue);
protected:
SapAcquisition *m_pAcq;
void *m_Context;
SapAcquisition::EventType m_EventType;
int m_EventCount;
SapAcquisition::SignalStatus m_SignalStatus;
COREVENTINFO m_EventInfo;
BOOL m_NewCallback;
};
#endif // _SAPACQUISITION_H_