genicam: make it easier in code to switch between different producers
This commit is contained in:
parent
b4455dbcf8
commit
1a3d985fd8
@ -51,6 +51,27 @@
|
|||||||
#define orc_memcpy memcpy
|
#define orc_memcpy memcpy
|
||||||
#endif
|
#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);
|
GST_DEBUG_CATEGORY_STATIC (gst_genicamsrc_debug);
|
||||||
#define GST_CAT_DEFAULT gst_genicamsrc_debug
|
#define GST_CAT_DEFAULT gst_genicamsrc_debug
|
||||||
|
|
||||||
@ -169,9 +190,7 @@ gboolean
|
|||||||
gst_genicamsrc_bind_functions (GstGenicamSrc * src)
|
gst_genicamsrc_bind_functions (GstGenicamSrc * src)
|
||||||
{
|
{
|
||||||
GModule *module;
|
GModule *module;
|
||||||
//const char cti_path[] = "C:\\BitFlow SDK 6.20\\Bin64\\BFGTL.cti";
|
const char cti_path[] = CTI_PATH;
|
||||||
const char cti_path[] =
|
|
||||||
"C:\\Program Files\\Basler\\pylon 5\\Runtime\\x64\\ProducerGEV.cti";
|
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (src, "Trying to bind functions from '%s'", cti_path);
|
GST_DEBUG_OBJECT (src, "Trying to bind functions from '%s'", cti_path);
|
||||||
@ -686,13 +705,15 @@ gst_genicamsrc_get_payload_size (GstGenicamSrc * src)
|
|||||||
ret =
|
ret =
|
||||||
GTL_DSGetInfo (src->hDS, STREAM_INFO_PAYLOAD_SIZE, &info_datatype,
|
GTL_DSGetInfo (src->hDS, STREAM_INFO_PAYLOAD_SIZE, &info_datatype,
|
||||||
&payload_size, &info_size);
|
&payload_size, &info_size);
|
||||||
|
GST_DEBUG_OBJECT(src, "Payload size defined by stream info: %d", payload_size);
|
||||||
} else {
|
} else {
|
||||||
guint32 val = 0;
|
guint32 val = 0;
|
||||||
size_t datasize = 4;
|
size_t datasize = 4;
|
||||||
// TODO: use node map
|
// 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");
|
HANDLE_GTL_ERROR ("Failed to get payload size");
|
||||||
payload_size = GUINT32_FROM_BE (val);
|
payload_size = GUINT32_FROM_BE (val);
|
||||||
|
GST_DEBUG_OBJECT(src, "Payload size defined by node map: %d", payload_size);
|
||||||
|
|
||||||
//PORT_HANDLE port_handle;
|
//PORT_HANDLE port_handle;
|
||||||
//ret = GTL_DevGetPort(src->hDEV, &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 */
|
/* TODO: query Data Stream features to find min/max num_buffers */
|
||||||
payload_size = gst_genicamsrc_get_payload_size (src);
|
payload_size = gst_genicamsrc_get_payload_size (src);
|
||||||
if (payload_size == 0) {
|
if (payload_size == 0) {
|
||||||
|
GST_DEBUG_OBJECT(src, "Payload size is zero");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,14 +753,15 @@ gst_genicamsrc_prepare_buffers (GstGenicamSrc * src)
|
|||||||
HANDLE_GTL_ERROR ("Failed to queue buffer");
|
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;
|
return TRUE;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_genicamsrc_start (GstBaseSrc * bsrc)
|
gst_genicamsrc_start (GstBaseSrc * bsrc)
|
||||||
{
|
{
|
||||||
@ -751,6 +774,7 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
|
|||||||
GST_DEBUG_OBJECT (src, "start");
|
GST_DEBUG_OBJECT (src, "start");
|
||||||
|
|
||||||
/* bind functions from CTI */
|
/* bind functions from CTI */
|
||||||
|
/* TODO: Enumerate CTI files in env var GENICAM_GENTL64_PATH */
|
||||||
if (!gst_genicamsrc_bind_functions (src)) {
|
if (!gst_genicamsrc_bind_functions (src)) {
|
||||||
GST_ELEMENT_ERROR (src, LIBRARY, INIT,
|
GST_ELEMENT_ERROR (src, LIBRARY, INIT,
|
||||||
("GenTL CTI could not be opened: %s", g_module_error ()), (NULL));
|
("GenTL CTI could not be opened: %s", g_module_error ()), (NULL));
|
||||||
@ -776,7 +800,7 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
|
|||||||
ret = GTL_TLGetNumInterfaces (src->hTL, &num_ifaces);
|
ret = GTL_TLGetNumInterfaces (src->hTL, &num_ifaces);
|
||||||
HANDLE_GTL_ERROR ("Failed to get number of interfaces");
|
HANDLE_GTL_ERROR ("Failed to get number of interfaces");
|
||||||
if (num_ifaces > 0) {
|
if (num_ifaces > 0) {
|
||||||
GST_DEBUG_OBJECT (src, "Found %dGenTL interfaces", num_ifaces);
|
GST_DEBUG_OBJECT (src, "Found %d GenTL interfaces", num_ifaces);
|
||||||
for (i = 0; i < num_ifaces; ++i) {
|
for (i = 0; i < num_ifaces; ++i) {
|
||||||
gst_genicam_print_interface_info (src, i);
|
gst_genicam_print_interface_info (src, i);
|
||||||
}
|
}
|
||||||
@ -1010,13 +1034,13 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
|
|||||||
// TODO: use Genicam node map for this
|
// TODO: use Genicam node map for this
|
||||||
guint32 val = 0;
|
guint32 val = 0;
|
||||||
size_t datasize = 4;
|
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");
|
HANDLE_GTL_ERROR ("Failed to get width");
|
||||||
width = GUINT32_FROM_BE (val);
|
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");
|
HANDLE_GTL_ERROR ("Failed to get height");
|
||||||
height = GUINT32_FROM_BE (val);
|
height = GUINT32_FROM_BE (val);
|
||||||
|
GST_DEBUG_OBJECT(src, "Width and height %dx%d", width, height);
|
||||||
bpp = 8;
|
bpp = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1043,15 +1067,17 @@ gst_genicamsrc_start (GstBaseSrc * bsrc)
|
|||||||
size_t datasize;
|
size_t datasize;
|
||||||
|
|
||||||
/* set AcquisitionMode to Continuous */
|
/* 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);
|
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");
|
HANDLE_GTL_ERROR ("Failed to start device acquisition");
|
||||||
|
|
||||||
/* send AcquisitionStart command */
|
/* send AcquisitionStart command */
|
||||||
val = GUINT32_TO_BE (1);
|
val = GUINT32_TO_BE (1);
|
||||||
datasize = sizeof (val);
|
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");
|
HANDLE_GTL_ERROR ("Failed to start device acquisition");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user