summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorMihael Koep <koep@schneide.com>2014-09-09 13:57:32 +0200
committerMihael Koep <koep@schneide.com>2014-09-17 09:45:13 +0200
commitf39be2686446c41a5fbf93eba7fb40ca99efcc3a (patch)
treee0c2a7d67a6677013fb176b2d374b468c7dcd470 /plugins
parent05523b118bf396f33528b7aa59db5ad1b7378d54 (diff)
downloaduca-f39be2686446c41a5fbf93eba7fb40ca99efcc3a.tar.gz
uca-f39be2686446c41a5fbf93eba7fb40ca99efcc3a.tar.bz2
uca-f39be2686446c41a5fbf93eba7fb40ca99efcc3a.tar.xz
uca-f39be2686446c41a5fbf93eba7fb40ca99efcc3a.zip
Add software roi feature to dexela plugin
Diffstat (limited to 'plugins')
-rw-r--r--plugins/dexela/CMakeLists.txt4
-rw-r--r--plugins/dexela/changelog.txt2
-rw-r--r--plugins/dexela/software-roi.c12
-rw-r--r--plugins/dexela/software-roi.h18
-rw-r--r--plugins/dexela/uca-dexela-camera.c52
5 files changed, 80 insertions, 8 deletions
diff --git a/plugins/dexela/CMakeLists.txt b/plugins/dexela/CMakeLists.txt
index a93ddc6..e7f0a11 100644
--- a/plugins/dexela/CMakeLists.txt
+++ b/plugins/dexela/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 2.6)
project(ucadexela C)
-set(VERSION "1.2.0")
+set(VERSION "1.3.0")
find_package(DEXELA)
@@ -20,7 +20,7 @@ if (DEXELA_FOUND)
include_directories(${DEXELA_INCLUDE_DIRS}
${UCA_CONFIGDIR})
- add_library(ucadexela SHARED uca-dexela-camera.c)
+ add_library(ucadexela SHARED uca-dexela-camera.c software-roi.c)
target_link_libraries(ucadexela ${UCA_DEPS} ${DEXELA_LIBRARIES})
diff --git a/plugins/dexela/changelog.txt b/plugins/dexela/changelog.txt
index 4bcd2d6..d535142 100644
--- a/plugins/dexela/changelog.txt
+++ b/plugins/dexela/changelog.txt
@@ -1,3 +1,5 @@
+* Tue Sep 9 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.0-1
+- add software roi feature
* Tue Jul 29 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.2.0-1
- bump plugin version for package management systems
* Wed Mar 19 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.0.3-1
diff --git a/plugins/dexela/software-roi.c b/plugins/dexela/software-roi.c
new file mode 100644
index 0000000..74baa96
--- /dev/null
+++ b/plugins/dexela/software-roi.c
@@ -0,0 +1,12 @@
+#include "software-roi.h"
+#include <string.h>
+
+void apply_software_roi(const guchar* src, guint srcWidth, guchar* dest, guint x, guint y, guint roiWidth, guint roiHeight)
+{
+ for (guint row = 0; row < roiHeight; row++) {
+ guint rowOffset = srcWidth * (y + row);
+ guint offset = rowOffset + x;
+ memcpy(dest + row * roiWidth, src + offset, roiWidth);
+ }
+}
+
diff --git a/plugins/dexela/software-roi.h b/plugins/dexela/software-roi.h
new file mode 100644
index 0000000..e2916f0
--- /dev/null
+++ b/plugins/dexela/software-roi.h
@@ -0,0 +1,18 @@
+#ifndef SOFTWAREROI_H
+#define SOFTWAREROI_H
+#include <glib.h>
+
+/**
+ * @brief apply_software_roi Extracts the pixels defined by x, y, roiWidth, roiHeight from
+ * the src array and writes them into the dest buffer
+ * @param src
+ * @param srcWidth
+ * @param dest
+ * @param x
+ * @param y
+ * @param roiWidth
+ * @param roiHeight
+ */
+void apply_software_roi(const guchar* src, guint srcWidth, guchar* dest, guint x, guint y, guint roiWidth, guint roiHeight);
+
+#endif // SOFTWAREROI_H
diff --git a/plugins/dexela/uca-dexela-camera.c b/plugins/dexela/uca-dexela-camera.c
index 4c30ad7..9269457 100644
--- a/plugins/dexela/uca-dexela-camera.c
+++ b/plugins/dexela/uca-dexela-camera.c
@@ -20,6 +20,7 @@
#include <gmodule.h>
#include "uca-dexela-camera.h"
#include "dexela/dexela_api.h"
+#include "software-roi.h"
#define UCA_DEXELA_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_DEXELA_CAMERA, UcaDexelaCameraPrivate))
@@ -73,6 +74,10 @@ struct _UcaDexelaCameraPrivate {
GValueArray *binnings;
guint width;
guint height;
+ guint roi_x;
+ guint roi_y;
+ guint roi_width;
+ guint roi_height;
guint bits;
gsize num_bytes;
};
@@ -182,14 +187,24 @@ static void uca_dexela_camera_get_property(GObject *object, guint property_id, G
g_value_set_uint(value, priv->height);
break;
}
+ case PROP_ROI_X:
+ {
+ g_value_set_uint(value, priv->roi_x);
+ break;
+ }
+ case PROP_ROI_Y:
+ {
+ g_value_set_uint(value, priv->roi_y);
+ break;
+ }
case PROP_ROI_WIDTH:
{
- g_value_set_uint(value, dexela_get_width());
+ g_value_set_uint(value, priv->roi_width);
break;
}
case PROP_ROI_HEIGHT:
{
- g_value_set_uint(value, dexela_get_height());
+ g_value_set_uint(value, priv->roi_height);
break;
}
case PROP_SENSOR_HORIZONTAL_BINNING:
@@ -246,6 +261,26 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
dexela_set_exposure_time_micros((gint) (exposureTimeInSeconds * MICROS_TO_SECONDS_FACTOR));
break;
}
+ case PROP_ROI_X:
+ {
+ priv->roi_x = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_Y:
+ {
+ priv->roi_y = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_WIDTH:
+ {
+ priv->roi_width = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_HEIGHT:
+ {
+ priv->roi_height = g_value_get_uint(value);
+ break;
+ }
case PROP_SENSOR_HORIZONTAL_BINNING:
{
const guint horizontalBinning = g_value_get_uint(value);
@@ -315,9 +350,10 @@ static void uca_dexela_camera_stop_recording(UcaCamera *camera, GError **error)
static gboolean uca_dexela_camera_grab(UcaCamera *camera, gpointer data, GError **error)
{
g_debug("grab called");
- g_return_if_fail(UCA_IS_DEXELA_CAMERA(camera));
+ g_return_val_if_fail(UCA_IS_DEXELA_CAMERA(camera), FALSE);
UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(camera);
- memcpy((gchar *) data, dexela_grab(), priv->width * priv->height * priv->num_bytes);
+ guchar* fullFrame = dexela_grab();
+ apply_software_roi(fullFrame, priv->width, data, priv->roi_x, priv->roi_y, priv->roi_width, priv->roi_height);
return TRUE;
}
@@ -361,12 +397,12 @@ static void uca_dexela_camera_class_init(UcaDexelaCameraClass *klass)
for (guint i = 0; base_overrideables[i] != 0; i++) {
g_object_class_override_property(gobject_class, base_overrideables[i], uca_camera_props[base_overrideables[i]]);
}
- dexela_properties[PROP_GAIN_MODE] =
+ dexela_properties[PROP_GAIN_MODE] =
g_param_spec_uint("gain-mode",
"High or Low Full Well",
"High (1) or Low (0) Full Well",
0, 1, 0, G_PARAM_READWRITE);
- dexela_properties[PROP_TEST_MODE] =
+ dexela_properties[PROP_TEST_MODE] =
g_param_spec_boolean("test-mode",
"Enable or disable test mode",
"Enable (true) or disable (false) test mode",
@@ -388,6 +424,10 @@ static void uca_dexela_camera_init(UcaDexelaCamera *self)
priv->bits = dexela_get_bit_depth();
priv->width = dexela_get_width();
priv->height = dexela_get_height();
+ priv->roi_x = 0;
+ priv->roi_y = 0;
+ priv->roi_width = priv->width;
+ priv->roi_height = priv->height;
priv->num_bytes = 2;
}