/***************************************************************************** * CIOIIDeviceDefines.h ***************************************************************************** * * Project: HALCON/libhalcon * Description: Defines for the integration interface for IO Devices * * (c) 2013-2020 by MVTec Software GmbH * www.mvtec.com * ***************************************************************************** * * *****************************************************************************/ #ifndef CIO_IIDEVICE_DEFINES_H #define CIO_IIDEVICE_DEFINES_H #ifndef HC_NO_IOIINTERFACE # define HIOII_VERSION 1300 # define HIOGET_IOII_VERSION(IOI_VERSION) ((IOI_VERSION) >> 16) # define HIOGET_IOII_HMAJOR(IOI_VERSION) \ (HIOGET_IOII_VERSION(IOI_VERSION) / 100) # define HIOGET_IOII_HMINOR(IOI_VERSION) \ (HIOGET_IOII_VERSION(IOI_VERSION) % 100) # define HIOGET_IOI_REVISION(IOI_VERSION) (((IOI_VERSION) >> 8) & 0xFF) # define HIOGET_IOI_BUILD(IOI_VERSION) ((IOI_VERSION)&0xFF) # define HIOI_VERSION(IOI_REVISION, IOI_BUILD) \ (((HIOII_VERSION) << 16) | ((IOI_REVISION) << 8) | (IOI_BUILD)) # if !defined HIOI_PREFIX # if defined H_PARALLEL # define HIOI_PREFIX "hio" # else # define HIOI_PREFIX "seqhio" # endif # endif # if !defined HIOI_SUFFIX # if defined HC_LARGE_IMAGES # define HIOI_SUFFIX "xl" # else # define HIOI_SUFFIX "" # endif # endif # if defined(__cplusplus) extern "C" { # endif # ifndef HC_NO_STRUCT_MEMBER_ALIGNMENT /* sets the struct member alignment to avoid problems if * the settings of the user differ to those of the HALCON * version. (8 is the default alignment, generally) */ # pragma pack(push, 8) # endif /* HIOInstance holds the general data of a (virtual) device instance */ typedef struct _HIOInstance { struct _HIOClass* ioclass; /* backward reference to the interface * class handle */ char* H_RESTRICT name; /* name of opened device */ void* iochnl_list; /* list of opened device channels */ void* H_RESTRICT usrinst; /* holds the device specific data, set by * the device interface. */ } HIOInstance; /* HIOChannel holds the general data of a (virtual) channel */ typedef struct _HIOChannel { char* H_RESTRICT name; /* name of opened channels */ struct _HIOInstance* ioinst; /* backward reference to the interface * device instance */ void* H_RESTRICT usrchnl; /* holds the channel specific data, set by * the device interface. */ } HIOChannel; /* HIOClass holds the class information of a io device interface */ typedef struct _HIOClass { /* -------------------------- internal ---------------------------------- */ char* interface_name; /* name of io class */ void* lib_handle; /* handle of interface library */ int32_t interface_version; /* current HALCON io device interface version */ int32_t flags; /* interface flags */ void* ioinst_list; /* list of instantiated device interfaces */ Hphandle handle; /* pointer to (shared) HALCON handle */ bool keep_open; /* If true, do not close the interface if no */ /* instances are open. */ /* ----------------- interface-specific functions ----------------------- */ Herror (*Cleanup)(Hproc_handle ph, struct _HIOClass* ioclass); Herror (*QueryInterface)(Hproc_handle ph); Herror (*OpenDevice)(Hproc_handle ph, HIOInstance* const* ioinst, INT4_8* inst_num); Herror (*CloseDevice)(Hproc_handle ph, HIOInstance* const* ioinst, INT4_8 inst_num); Herror (*SetDeviceParam)(Hproc_handle ph, HIOInstance* H_RESTRICT ioinst); Herror (*GetDeviceParam)(Hproc_handle ph, HIOInstance const* ioinst); Herror (*QueryDevice)(Hproc_handle ph, HIOInstance const* ioinst); Herror (*OpenChannel)(Hproc_handle ph, HIOInstance const* ioinst, HIOChannel* const* iochnls, INT4_8* chnlnum); Herror (*CloseChannel)(Hproc_handle ph, HIOChannel* const* iochnls, INT4_8 chnlnum); Herror (*SetChannelParam)(Hproc_handle ph, HIOChannel* const* iochnls, INT4_8 chnlnum); Herror (*GetChannelParam)(Hproc_handle ph, HIOChannel const* const* iochnls, INT4_8 chnlnum); Herror (*ReadChannel)(Hproc_handle ph, HIOChannel const* const* iochnls, INT4_8 chnlnum); Herror (*WriteChannel)(Hproc_handle ph, HIOChannel* const* iochnls, INT4_8 chnlnum); /* These are optional */ Herror (*ControlInterface)(Hproc_handle ph); Herror (*ControlDevice)(Hproc_handle ph, HIOInstance const* ioinst); Herror (*ControlChannel)(Hproc_handle ph, HIOChannel* const* iochnls, INT4_8 chnlnum); } HIOClass; typedef Herror (*HIOI_INIT_FUNC)(Hproc_handle, HIOClass*); # define HIOI_INIT_NAME "HIOIInit" # define HIOI_FLAGS_NAME "HIOIFlags" /* * Special IO interface flags. Tp set the flags, the interface should export * the symbol HIOI_FLAGS_NAME, which must be an int32_t. * * The following flags are defined: * * HIO_FLAG_THREAD_INIT: if set, the interface cleanup function is called * from the same thread as the init function. */ # define HIO_FLAG_THREAD_INIT (1 << 0) # ifndef HC_NO_STRUCT_MEMBER_ALIGNMENT # pragma pack(pop) # endif # if defined(__cplusplus) } # endif #endif /* ifndef HC_NO_IOIINTERFACE */ #endif /* ifndef CIO_IIDEVICE_DEFINES_H */