genicam: make it easier in code to switch between different producers

This commit is contained in:
Joshua M. Doe 2021-03-23 14:14:54 -04:00
parent b4455dbcf8
commit 1a3d985fd8

View File

@ -51,6 +51,27 @@
#define orc_memcpy memcpy
#endif
// "C:\\BitFlow SDK 6.20\\Bin64\\BFGTL.cti";
// "C:\\Program Files\\Basler\\pylon 5\\Runtime\\x64\\ProducerGEV.cti";
// EVT
#define GENAPI_WIDTH 0xA000
#define GENAPI_HEIGHT 0xA004
#define GENAPI_PAYLOAD_SIZE 0xD008
#define GENAPI_ACQMODE 0xB000
#define GENAPI_ACQSTART 0xB004
#define GENAPI_ACQSTOP 0xB008
#define CTI_PATH "C:\\Program Files\\EVT\\eSDK\\bin\\EmergentGenTL.cti"
// Basler
//#define GENAPI_WIDTH 0x30204
//#define GENAPI_HEIGHT 0x30224
//#define GENAPI_PAYLOAD_SIZE 0x10088
//#define GENAPI_ACQMODE 0x40004
//#define GENAPI_ACQSTART 0x40024
//#define GENAPI_ACQSTOP 0x40044
//#define CTI_PATH "C:\\Program Files\\Basler\\pylon 6\\Runtime\\x64\\ProducerGEV.cti"
GST_DEBUG_CATEGORY_STATIC (gst_genicamsrc_debug);
#define GST_CAT_DEFAULT gst_genicamsrc_debug
@ -169,9 +190,7 @@ gboolean
gst_genicamsrc_bind_functions (GstGenicamSrc * src)
{
GModule *module;
//const char cti_path[] = "C:\\BitFlow SDK 6.20\\Bin64\\BFGTL.cti";
const char cti_path[] =
"C:\\Program Files\\Basler\\pylon 5\\Runtime\\x64\\ProducerGEV.cti";
const char cti_path[] = CTI_PATH;
gboolean ret = TRUE;
GST_DEBUG_OBJECT (src, "Trying to bind functions from '%s'", cti_path);
@ -686,13 +705,15 @@ gst_genicamsrc_get_payload_size (GstGenicamSrc * src)
ret =
GTL_DSGetInfo (src->hDS, STREAM_INFO_PAYLOAD_SIZE, &info_datatype,
&payload_size, &info_size);
GST_DEBUG_OBJECT(src, "Payload size defined by stream info: %d", payload_size);
} else {
guint32 val = 0;
size_t datasize = 4;
// TODO: use node map
ret = GTL_GCReadPort (src->hDevPort, 0x10088, &val, &datasize);
ret = GTL_GCReadPort (src->hDevPort, GENAPI_PAYLOAD_SIZE, &val, &datasize);
HANDLE_GTL_ERROR ("Failed to get payload size");
payload_size = GUINT32_FROM_BE (val);
GST_DEBUG_OBJECT(src, "Payload size defined by node map: %d", payload_size);
//PORT_HANDLE port_handle;
//ret = GTL_DevGetPort(src->hDEV, &port_handle);
@ -720,6 +741,7 @@ gst_genicamsrc_prepare_buffers (GstGenicamSrc * src)
/* TODO: query Data Stream features to find min/max num_buffers */
payload_size = gst_genicamsrc_get_payload_size (src);
if (payload_size == 0) {
GST_DEBUG_OBJECT(src, "Payload size is zero");
return FALSE;
}
@ -731,14 +753,15 @@ gst_genicamsrc_prepare_buffers (GstGenicamSrc * src)
HANDLE_GTL_ERROR ("Failed to queue buffer");
}
ret = GTL_DSFlushQueue (src->hDS, ACQ_QUEUE_ALL_TO_INPUT);
HANDLE_GTL_ERROR("Failed to queue all buffers to input");
return TRUE;
error:
return FALSE;
}
static gboolean
gst_genicamsrc_start (GstBaseSrc * bsrc)
{
@ -751,6 +774,7 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
GST_DEBUG_OBJECT (src, "start");
/* bind functions from CTI */
/* TODO: Enumerate CTI files in env var GENICAM_GENTL64_PATH */
if (!gst_genicamsrc_bind_functions (src)) {
GST_ELEMENT_ERROR (src, LIBRARY, INIT,
("GenTL CTI could not be opened: %s", g_module_error ()), (NULL));
@ -1010,13 +1034,13 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
// TODO: use Genicam node map for this
guint32 val = 0;
size_t datasize = 4;
ret = GTL_GCReadPort (src->hDevPort, 0x30204, &val, &datasize);
ret = GTL_GCReadPort (src->hDevPort, GENAPI_WIDTH, &val, &datasize);
HANDLE_GTL_ERROR ("Failed to get width");
width = GUINT32_FROM_BE (val);
ret = GTL_GCReadPort (src->hDevPort, 0x30224, &val, &datasize);
ret = GTL_GCReadPort (src->hDevPort, GENAPI_HEIGHT, &val, &datasize);
HANDLE_GTL_ERROR ("Failed to get height");
height = GUINT32_FROM_BE (val);
GST_DEBUG_OBJECT(src, "Width and height %dx%d", width, height);
bpp = 8;
}
@ -1043,15 +1067,17 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
size_t datasize;
/* set AcquisitionMode to Continuous */
val = GUINT32_TO_BE (2);
// TODO: "Continuous" value can have different integer values, we need
// to look it up in the node map (EVT is 0, Basler is 2)
val = GUINT32_TO_BE (0);
datasize = sizeof (val);
ret = GTL_GCWritePort (src->hDevPort, 0x40004, &val, &datasize);
ret = GTL_GCWritePort (src->hDevPort, GENAPI_ACQMODE, &val, &datasize);
HANDLE_GTL_ERROR ("Failed to start device acquisition");
/* send AcquisitionStart command */
val = GUINT32_TO_BE (1);
datasize = sizeof (val);
ret = GTL_GCWritePort (src->hDevPort, 0x40024, &val, &datasize);
ret = GTL_GCWritePort (src->hDevPort, GENAPI_ACQSTART, &val, &datasize);
HANDLE_GTL_ERROR ("Failed to start device acquisition");
}