niimaqdxsrc: add is-controller property to open as controller or listener

This commit is contained in:
Joshua M. Doe 2017-04-25 10:18:50 -04:00
parent 3e20a7491e
commit 4a18d3e118
2 changed files with 29 additions and 7 deletions

View File

@ -55,13 +55,15 @@ enum
PROP_DEVICE, PROP_DEVICE,
PROP_RING_BUFFER_COUNT, PROP_RING_BUFFER_COUNT,
PROP_ATTRIBUTES, PROP_ATTRIBUTES,
PROP_BAYER_AS_GRAY PROP_BAYER_AS_GRAY,
PROP_IS_CONTROLLER
}; };
#define DEFAULT_PROP_DEVICE "cam0" #define DEFAULT_PROP_DEVICE "cam0"
#define DEFAULT_PROP_RING_BUFFER_COUNT 3 #define DEFAULT_PROP_RING_BUFFER_COUNT 3
#define DEFAULT_PROP_ATTRIBUTES "" #define DEFAULT_PROP_ATTRIBUTES ""
#define DEFAULT_PROP_BAYER_AS_GRAY FALSE #define DEFAULT_PROP_BAYER_AS_GRAY FALSE
#define DEFAULT_PROP_IS_CONTROLLER TRUE
static void gst_niimaqdxsrc_init_interfaces (GType type); static void gst_niimaqdxsrc_init_interfaces (GType type);
@ -431,7 +433,11 @@ gst_niimaqdxsrc_class_init (GstNiImaqDxSrcClass * klass)
g_param_spec_boolean ("bayer-as-gray", "Bayer as gray", g_param_spec_boolean ("bayer-as-gray", "Bayer as gray",
"For Bayer sources use GRAY caps", DEFAULT_PROP_BAYER_AS_GRAY, "For Bayer sources use GRAY caps", DEFAULT_PROP_BAYER_AS_GRAY,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_IS_CONTROLLER,
g_param_spec_boolean ("is-controller", "Open as controller",
"True for controller mode, false for listener mode",
DEFAULT_PROP_IS_CONTROLLER,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
{ {
GstCaps *caps = gst_caps_new_empty (); GstCaps *caps = gst_caps_new_empty ();
int i; int i;
@ -483,6 +489,8 @@ gst_niimaqdxsrc_init (GstNiImaqDxSrc * src)
src->ringbuffer_count = DEFAULT_PROP_RING_BUFFER_COUNT; src->ringbuffer_count = DEFAULT_PROP_RING_BUFFER_COUNT;
src->device_name = g_strdup (DEFAULT_PROP_DEVICE); src->device_name = g_strdup (DEFAULT_PROP_DEVICE);
src->attributes = g_strdup (DEFAULT_PROP_ATTRIBUTES); src->attributes = g_strdup (DEFAULT_PROP_ATTRIBUTES);
src->bayer_as_gray = DEFAULT_PROP_BAYER_AS_GRAY;
src->is_controller = DEFAULT_PROP_IS_CONTROLLER;
/* initialize pointers, then call reset to initialize the rest */ /* initialize pointers, then call reset to initialize the rest */
src->temp_buffer = NULL; src->temp_buffer = NULL;
@ -537,6 +545,9 @@ gst_niimaqdxsrc_set_property (GObject * object, guint prop_id,
case PROP_BAYER_AS_GRAY: case PROP_BAYER_AS_GRAY:
src->bayer_as_gray = g_value_get_boolean (value); src->bayer_as_gray = g_value_get_boolean (value);
break; break;
case PROP_IS_CONTROLLER:
src->is_controller = g_value_get_boolean (value);
break;
default: default:
break; break;
} }
@ -561,6 +572,9 @@ gst_niimaqdxsrc_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_BAYER_AS_GRAY: case PROP_BAYER_AS_GRAY:
g_value_set_boolean (value, src->bayer_as_gray); g_value_set_boolean (value, src->bayer_as_gray);
break; break;
case PROP_IS_CONTROLLER:
g_value_set_boolean (value, src->is_controller);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -958,22 +972,29 @@ gst_niimaqdxsrc_start (GstBaseSrc * bsrc)
{ {
GstNiImaqDxSrc *src = GST_NIIMAQDXSRC (bsrc); GstNiImaqDxSrc *src = GST_NIIMAQDXSRC (bsrc);
IMAQdxError rval; IMAQdxError rval;
IMAQdxCameraControlMode control_mode;
gst_niimaqdxsrc_reset (src); gst_niimaqdxsrc_reset (src);
GST_LOG_OBJECT (src, "Opening IMAQ interface: %s", src->device_name); if (src->is_controller) {
control_mode = IMAQdxCameraControlModeController;
GST_LOG_OBJECT (src, "Opening IMAQdx interface '%s' in controller mode",
src->device_name);
} else {
control_mode = IMAQdxCameraControlModeListener;
GST_LOG_OBJECT (src, "Opening IMAQxd interface '%s' in listener mode",
src->device_name);
}
/* open IMAQ interface */ /* open IMAQ interface */
rval = IMAQdxOpenCamera (src->device_name, rval = IMAQdxOpenCamera (src->device_name, control_mode, &src->session);
IMAQdxCameraControlModeController, &src->session);
if (rval != IMAQdxErrorSuccess) { if (rval != IMAQdxErrorSuccess) {
gst_niimaqdxsrc_report_imaq_error (rval); gst_niimaqdxsrc_report_imaq_error (rval);
GST_WARNING_OBJECT (src, "Failed to open camera '%s', will try resetting.", GST_WARNING_OBJECT (src, "Failed to open camera '%s', will try resetting.",
src->device_name); src->device_name);
rval = IMAQdxResetCamera (src->device_name, FALSE); rval = IMAQdxResetCamera (src->device_name, FALSE);
rval = IMAQdxOpenCamera (src->device_name, rval = IMAQdxOpenCamera (src->device_name, control_mode, &src->session);
IMAQdxCameraControlModeController, &src->session);
if (rval != IMAQdxErrorSuccess) { if (rval != IMAQdxErrorSuccess) {
gst_niimaqdxsrc_report_imaq_error (rval); gst_niimaqdxsrc_report_imaq_error (rval);
GST_ELEMENT_ERROR (src, RESOURCE, FAILED, GST_ELEMENT_ERROR (src, RESOURCE, FAILED,

View File

@ -64,6 +64,7 @@ struct _GstNiImaqDxSrc {
gint ringbuffer_count; gint ringbuffer_count;
gchar *attributes; gchar *attributes;
gboolean bayer_as_gray; gboolean bayer_as_gray;
gboolean is_controller;
/* image info */ /* image info */
char pixel_format[IMAQDX_MAX_API_STRING_LENGTH]; char pixel_format[IMAQDX_MAX_API_STRING_LENGTH];