summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2016-07-07 10:09:49 +0200
committerMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2016-07-07 10:12:31 +0200
commitd50e109380ef3a91e286ccd858b87e732eba0f1f (patch)
tree45371da372587887002135c69f3308778afffef1
parentae0269155e1e2d0d602a0892b4bcdd2df708d53c (diff)
downloaduca-ufo-d50e109380ef3a91e286ccd858b87e732eba0f1f.tar.gz
uca-ufo-d50e109380ef3a91e286ccd858b87e732eba0f1f.tar.bz2
uca-ufo-d50e109380ef3a91e286ccd858b87e732eba0f1f.tar.xz
uca-ufo-d50e109380ef3a91e286ccd858b87e732eba0f1f.zip
Fix #2: reset frame request and flush at the end
This is an intermediate fix proposed by Michele but not really solving the underlying issue of the FPGA getting stuck. The fix consists of two separate solutions: 1. In case we encounter an error while grabbing we reset the command queue on the FPGA (i.e. flipping third bit on the control register). 2. We read all stale data from the FPGA with a timeout now. Before it was still possible to have stale data in the DDR thus corrupting subsequent data reads.
-rw-r--r--uca-ufo-camera.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/uca-ufo-camera.c b/uca-ufo-camera.c
index 041efe7..be06040 100644
--- a/uca-ufo-camera.c
+++ b/uca-ufo-camera.c
@@ -357,7 +357,6 @@ static void
uca_ufo_camera_stop_recording (UcaCamera *camera, GError **error)
{
UcaUfoCameraPrivate *priv;
- UcaCameraTriggerSource trigger_source;
pcilib_event_id_t event_id;
pcilib_event_info_t event_info;
int err;
@@ -369,8 +368,6 @@ uca_ufo_camera_stop_recording (UcaCamera *camera, GError **error)
set_control_bit (priv, 14, FALSE); /* disable external trigger */
set_control_bit (priv, 11, FALSE); /* disable streaming */
- g_object_get (G_OBJECT (camera), "trigger-source", &trigger_source, NULL);
-
if (priv->async_thread) {
err = pcilib_stop(priv->handle, PCILIB_EVENT_FLAG_STOP_ONLY);
PCILIB_SET_ERROR(err, UCA_UFO_CAMERA_ERROR_STOP_RECORDING);
@@ -379,7 +376,7 @@ uca_ufo_camera_stop_recording (UcaCamera *camera, GError **error)
}
/* read stale frames ... */
- while (!pcilib_get_next_event (priv->handle, 0, &event_id, sizeof (pcilib_event_info_t), &event_info))
+ while (!pcilib_get_next_event (priv->handle, priv->timeout, &event_id, sizeof (pcilib_event_info_t), &event_info))
;
err = pcilib_stop (priv->handle, PCILIB_EVENT_FLAGS_DEFAULT);
@@ -410,6 +407,17 @@ uca_ufo_camera_grab(UcaCamera *camera, gpointer data, GError **error)
const gsize size = CMOSIS_SENSOR_WIDTH * priv->roi_height * sizeof(guint16);
err = pcilib_get_next_event (priv->handle, priv->timeout, &event_id, sizeof(pcilib_event_info_t), &event_info);
+
+ /*
+ * Try to recover from errors by flushing pending requests. This is curing
+ * symptoms but not the actual problem.
+ */
+ if (err != 0) {
+ set_control_bit (priv, 2, TRUE);
+ g_usleep (10);
+ set_control_bit (priv, 2, FALSE);
+ }
+
PCILIB_SET_ERROR_RETURN_FALSE (err, UCA_UFO_CAMERA_ERROR_NEXT_EVENT);
gpointer src = pcilib_get_data (priv->handle, event_id, PCILIB_EVENT_DATA, (size_t *) &err);
@@ -769,7 +777,7 @@ uca_ufo_camera_init(UcaUfoCamera *self)
self->priv = priv = UCA_UFO_CAMERA_GET_PRIVATE(self);
priv->construct_error = NULL;
priv->async_thread = NULL;
- priv->timeout = 5000;
+ priv->timeout = 100000;
if (!setup_pcilib (priv))
return;