diff options
-rw-r--r-- | plugins/xkit/uca-xkit-camera.cc | 81 |
1 files changed, 70 insertions, 11 deletions
diff --git a/plugins/xkit/uca-xkit-camera.cc b/plugins/xkit/uca-xkit-camera.cc index 525aa79..6ecae84 100644 --- a/plugins/xkit/uca-xkit-camera.cc +++ b/plugins/xkit/uca-xkit-camera.cc @@ -33,6 +33,8 @@ #define UCA_XKIT_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_XKIT_CAMERA, UcaXkitCameraPrivate)) +#define MEDIPIX_SENSOR_HEIGHT 256 + static void uca_xkit_camera_initable_iface_init (GInitableIface *iface); G_DEFINE_TYPE_WITH_CODE (UcaXkitCamera, uca_xkit_camera, UCA_TYPE_CAMERA, @@ -52,7 +54,12 @@ enum { }; static gint base_overrideables[] = { + PROP_NAME, + PROP_SENSOR_WIDTH, + PROP_SENSOR_HEIGHT, PROP_SENSOR_BITDEPTH, + PROP_ROI_X, + PROP_ROI_Y, PROP_ROI_WIDTH, PROP_ROI_HEIGHT, 0, @@ -64,15 +71,26 @@ static guint N_PROPERTIES; struct _UcaXkitCameraPrivate { GError *construct_error; + Mpx2Interface *interface; + gint devices[4]; + gint n_devices; + gint device; + DevInfo info; }; static gboolean setup_xkit (UcaXkitCameraPrivate *priv) { - Mpx2Interface *interface; - interface = getMpx2Interface(); + priv->interface = getMpx2Interface(); + priv->interface->findDevices (priv->devices, &priv->n_devices); + + if (priv->n_devices > 0) + priv->interface->init (priv->devices[0]); + + priv->device = priv->devices[0]; + priv->interface->getDevInfo (priv->device, &priv->info); return TRUE; } @@ -110,7 +128,34 @@ uca_xkit_camera_grab (UcaCamera *camera, gpointer data, GError **error) { + UcaXkitCameraPrivate *priv; + guint32 size; g_return_val_if_fail (UCA_IS_XKIT_CAMERA (camera), FALSE); + + /* XXX: For now we trigger on our own because the X-KIT chip does not + * provide auto triggering */ + + priv = UCA_XKIT_CAMERA_GET_PRIVATE (camera); + size = priv->info.pixCount * 2; + + if (priv->interface->startAcquisition (priv->device)) { + g_set_error_literal (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING, + "Could not pre-trigger"); + return FALSE; + } + + if (priv->interface->readMatrix (priv->device, (gint16 *) data, size)) { + g_set_error_literal (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING, + "Could not grab frame"); + return FALSE; + } + + if (priv->interface->stopAcquisition (priv->device)) { + g_set_error_literal (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING, + "Could stop acquisition"); + return FALSE; + } + return TRUE; } @@ -142,18 +187,33 @@ uca_xkit_camera_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - /* UcaXkitCameraPrivate *priv = UCA_XKIT_CAMERA_GET_PRIVATE(object); */ + UcaXkitCameraPrivate *priv = UCA_XKIT_CAMERA_GET_PRIVATE (object); switch (property_id) { - case PROP_ROI_WIDTH: - g_value_set_uint (value, 512); + case PROP_NAME: + g_value_set_string (value, priv->info.ifaceName); break; - case PROP_ROI_HEIGHT: - g_value_set_uint (value, 512); + case PROP_SENSOR_WIDTH: + g_value_set_uint (value, priv->info.rowLen); + break; + case PROP_SENSOR_HEIGHT: + g_value_set_uint (value, priv->info.numberOfRows * MEDIPIX_SENSOR_HEIGHT); break; case PROP_SENSOR_BITDEPTH: g_value_set_uint (value, 11); break; + case PROP_ROI_X: + g_value_set_uint (value, 0); + break; + case PROP_ROI_Y: + g_value_set_uint (value, 0); + break; + case PROP_ROI_WIDTH: + g_value_set_uint (value, priv->info.rowLen); + break; + case PROP_ROI_HEIGHT: + g_value_set_uint (value, priv->info.numberOfRows * MEDIPIX_SENSOR_HEIGHT); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -229,13 +289,12 @@ uca_xkit_camera_class_init (UcaXkitCameraClass *klass) } static void -uca_xkit_camera_init(UcaXkitCamera *self) +uca_xkit_camera_init (UcaXkitCamera *self) { - UcaCamera *camera; UcaXkitCameraPrivate *priv; GObjectClass *oclass; - self->priv = priv = UCA_XKIT_CAMERA_GET_PRIVATE(self); + self->priv = priv = UCA_XKIT_CAMERA_GET_PRIVATE (self); priv->construct_error = NULL; if (!setup_xkit (priv)) @@ -244,7 +303,7 @@ uca_xkit_camera_init(UcaXkitCamera *self) oclass = G_OBJECT_GET_CLASS (self); for (guint id = N_BASE_PROPERTIES; id < N_PROPERTIES; id++) - g_object_class_install_property(oclass, id, ufo_properties[id]); + g_object_class_install_property (oclass, id, ufo_properties[id]); } G_MODULE_EXPORT GType |