summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/dexela/CMakeLists.txt4
-rw-r--r--plugins/dexela/changelog.txt7
-rw-r--r--plugins/dexela/uca-dexela-camera.c150
-rw-r--r--plugins/file/CMakeLists.txt6
-rw-r--r--plugins/mock/CMakeLists.txt4
-rw-r--r--plugins/pco/CMakeLists.txt4
-rw-r--r--plugins/pf/CMakeLists.txt4
-rw-r--r--plugins/pylon/CMakeLists.txt4
-rw-r--r--plugins/pylon/changelog.txt4
-rw-r--r--plugins/pylon/uca-pylon-camera.c9
-rw-r--r--plugins/ufo/CMakeLists.txt4
11 files changed, 144 insertions, 56 deletions
diff --git a/plugins/dexela/CMakeLists.txt b/plugins/dexela/CMakeLists.txt
index c9edd54..d04c2e6 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.3.2")
+set(VERSION "1.4.0")
find_package(DEXELA)
@@ -11,7 +11,7 @@ if (DEXELA_FOUND)
set(PLUGIN_SUMMARY "Dexela plugin for libuca")
set(PLUGIN_CHANGELOG "${CMAKE_CURRENT_SOURCE_DIR}/changelog.txt")
set(PLUGIN_DESCRIPTION "Plugin for the Dexela 1207 detector.")
- set(PLUGIN_REQUIRES "libuca >= 1.3.0, libdexela >= 1.1.0")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0, libdexela >= 1.2.0")
set(PLUGIN_VENDOR "ANKA Computing Group")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
diff --git a/plugins/dexela/changelog.txt b/plugins/dexela/changelog.txt
index 5b44262..7b2d81b 100644
--- a/plugins/dexela/changelog.txt
+++ b/plugins/dexela/changelog.txt
@@ -1,3 +1,10 @@
+* Mon May 18 2015 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.4.0-1
+- Update to libuca 2.0.0
+- Report errors opening the detector instead of crashing
+* Tue Mar 17 2015 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.3-1
+- adjust the ROI depending on the binning
+* Wed Oct 8 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.2-2
+- new revision for libuca 1.6.0
* Tue Sep 16 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.2-1
- implement sensor pixel width and height properties
* Tue Sep 16 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.1-1
diff --git a/plugins/dexela/uca-dexela-camera.c b/plugins/dexela/uca-dexela-camera.c
index 81d9f74..3e22c06 100644
--- a/plugins/dexela/uca-dexela-camera.c
+++ b/plugins/dexela/uca-dexela-camera.c
@@ -57,7 +57,7 @@ static gint base_overrideables[] = {
PROP_SENSOR_VERTICAL_BINNING,
PROP_SENSOR_VERTICAL_BINNINGS,
PROP_EXPOSURE_TIME,
- PROP_TRIGGER_MODE,
+ PROP_TRIGGER_SOURCE,
PROP_ROI_X,
PROP_ROI_Y,
PROP_ROI_WIDTH,
@@ -76,6 +76,8 @@ static const gdouble MINIMUM_EXPOSURE_TIME_IN_SECONDS = 0.017d; // 17ms as per d
static const gdouble PIXEL_SIZE = 74.8e-6; // 74.8µm as per data sheet
struct _UcaDexelaCameraPrivate {
+ GError* init_error;
+
GValueArray *binnings;
guint width;
guint height;
@@ -85,7 +87,8 @@ struct _UcaDexelaCameraPrivate {
guint roi_height;
guint bits;
gsize num_bytes;
- UcaCameraTrigger uca_trigger_mode;
+ UcaCameraTriggerSource uca_trigger_source;
+ UcaCameraTriggerType uca_trigger_type;
};
/**
@@ -105,35 +108,51 @@ static void fill_binnings(UcaDexelaCameraPrivate *priv)
g_value_array_append(priv->binnings, &val);
}
-static void map_dexela_trigger_mode_to_uca(UcaDexelaCameraPrivate *priv, GValue* value, TriggerMode mode)
+static void map_dexela_trigger_mode_to_uca_source(UcaDexelaCameraPrivate *priv, GValue* value, TriggerMode mode)
{
if (mode == SOFTWARE) {
- g_value_set_enum(value, priv->uca_trigger_mode);
- return;
+ priv->uca_trigger_source = UCA_CAMERA_TRIGGER_SOURCE_AUTO;
+ }
+ if (mode == EDGE || mode == DURATION) {
+ priv->uca_trigger_source = UCA_CAMERA_TRIGGER_SOURCE_EXTERNAL;
}
+ g_value_set_enum(value, priv->uca_trigger_source);
+}
+
+static void map_dexela_trigger_mode_to_uca_type(UcaDexelaCameraPrivate *priv, GValue* value, TriggerMode mode)
+{
if (mode == EDGE) {
- g_value_set_enum(value, UCA_CAMERA_TRIGGER_EXTERNAL);
- return;
+ priv->uca_trigger_type = UCA_CAMERA_TRIGGER_TYPE_EDGE;
+ }
+ if (mode == DURATION) {
+ priv->uca_trigger_type = UCA_CAMERA_TRIGGER_TYPE_LEVEL;
}
- g_warning("Unsupported dexela trigger mode: %d", mode);
+ g_value_set_enum(value, priv->uca_trigger_type);
}
-static void set_trigger_mode(UcaDexelaCameraPrivate *priv, UcaCameraTrigger mode)
+static void set_triggering(UcaDexelaCameraPrivate *priv, UcaCameraTriggerSource source, UcaCameraTriggerType type)
{
- priv->uca_trigger_mode = mode;
- if (mode == UCA_CAMERA_TRIGGER_AUTO) {
+ priv->uca_trigger_source = source;
+ priv->uca_trigger_type = type;
+ if (source == UCA_CAMERA_TRIGGER_SOURCE_AUTO) {
dexela_set_trigger_mode(SOFTWARE);
return;
}
- if (mode == UCA_CAMERA_TRIGGER_SOFTWARE) {
+ if (source == UCA_CAMERA_TRIGGER_SOURCE_SOFTWARE) {
dexela_set_trigger_mode(SOFTWARE);
return;
}
- if (mode == UCA_CAMERA_TRIGGER_EXTERNAL) {
- dexela_set_trigger_mode(EDGE);
- return;
+ if (source == UCA_CAMERA_TRIGGER_SOURCE_EXTERNAL) {
+ if (type == UCA_CAMERA_TRIGGER_TYPE_EDGE) {
+ dexela_set_trigger_mode(EDGE);
+ return;
+ }
+ if (type == UCA_CAMERA_TRIGGER_TYPE_LEVEL) {
+ dexela_set_trigger_mode(DURATION);
+ return;
+ }
}
- g_warning("Unsupported uca trigger mode: %d", mode);
+ g_warning("Unsupported uca trigger source and type: %d/%d", source, type);
}
static gboolean is_binning_allowed(UcaDexelaCameraPrivate *priv, guint binning)
@@ -147,6 +166,28 @@ static gboolean is_binning_allowed(UcaDexelaCameraPrivate *priv, guint binning)
return FALSE;
}
+static guint real_width(UcaDexelaCameraPrivate *priv)
+{
+ return priv->width / dexela_get_binning_mode_horizontal();
+}
+
+static guint real_height(UcaDexelaCameraPrivate *priv)
+{
+ return priv->height / dexela_get_binning_mode_vertical();
+}
+
+static void adjust_roi_width(UcaDexelaCameraPrivate *priv, guint requested_width)
+{
+ guint maxRoiWidth = real_width(priv) - priv->roi_x;
+ priv->roi_width = min(maxRoiWidth, requested_width);
+}
+
+static void adjust_roi_height(UcaDexelaCameraPrivate *priv, guint requested_height)
+{
+ guint maxRoiHeight = real_height(priv) - priv->roi_y;
+ priv->roi_height = min(maxRoiHeight, requested_height);
+}
+
static void uca_dexela_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
{
UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(object);
@@ -249,9 +290,14 @@ static void uca_dexela_camera_get_property(GObject *object, guint property_id, G
g_value_set_boolean(value, dexela_get_control_register() & 1);
break;
}
- case PROP_TRIGGER_MODE:
+ case PROP_TRIGGER_SOURCE:
+ {
+ map_dexela_trigger_mode_to_uca_source(priv, value, dexela_get_trigger_mode());
+ break;
+ }
+ case PROP_TRIGGER_TYPE:
{
- map_dexela_trigger_mode_to_uca(priv, value, dexela_get_trigger_mode());
+ map_dexela_trigger_mode_to_uca_type(priv, value, dexela_get_trigger_mode());
break;
}
default:
@@ -281,22 +327,28 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
}
case PROP_ROI_X:
{
- priv->roi_x = g_value_get_uint(value);
+ guint maxRoiX = real_width(priv) - 1;
+ guint requestedRoiX = g_value_get_uint(value);
+ priv->roi_x = min(maxRoiX, requestedRoiX);
+ adjust_roi_width(priv, priv->roi_width);
break;
}
case PROP_ROI_Y:
{
- priv->roi_y = g_value_get_uint(value);
+ guint maxRoiY = real_height(priv) -1;
+ guint requestedRoiY = g_value_get_uint(value);
+ priv->roi_y = min(maxRoiY, requestedRoiY);
+ adjust_roi_height(priv, priv->roi_height);
break;
}
case PROP_ROI_WIDTH:
{
- priv->roi_width = g_value_get_uint(value);
+ adjust_roi_width(priv, g_value_get_uint(value));
break;
}
case PROP_ROI_HEIGHT:
{
- priv->roi_height = g_value_get_uint(value);
+ adjust_roi_height(priv, g_value_get_uint(value));
break;
}
case PROP_SENSOR_HORIZONTAL_BINNING:
@@ -306,7 +358,8 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
g_warning("Tried to set illegal horizontal binning: %d", horizontalBinning);
return;
}
- dexela_set_binning_mode(horizontalBinning, dexela_get_binning_mode_vertical());
+ dexela_set_binning_mode(horizontalBinning, horizontalBinning);
+ adjust_roi_width(priv, priv->roi_width);
break;
}
case PROP_SENSOR_VERTICAL_BINNING:
@@ -316,7 +369,8 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
g_warning("Tried to set illegal vertical binning: %d", verticalBinning);
return;
}
- dexela_set_binning_mode(dexela_get_binning_mode_horizontal(), verticalBinning);
+ dexela_set_binning_mode(verticalBinning, verticalBinning);
+ adjust_roi_height(priv, priv->roi_height);
break;
}
case PROP_GAIN_MODE:
@@ -342,9 +396,14 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
dexela_set_control_register(dexela_get_control_register() & 0xFFFE);
break;
}
- case PROP_TRIGGER_MODE:
+ case PROP_TRIGGER_SOURCE:
+ {
+ set_triggering(priv, g_value_get_enum(value), priv->uca_trigger_type);
+ break;
+ }
+ case PROP_TRIGGER_TYPE:
{
- set_trigger_mode(priv, g_value_get_enum(value));
+ set_triggering(priv, priv->uca_trigger_source, g_value_get_enum(value));
break;
}
default:
@@ -371,11 +430,11 @@ static gboolean uca_dexela_camera_grab(UcaCamera *camera, gpointer data, GError
g_return_val_if_fail(UCA_IS_DEXELA_CAMERA(camera), FALSE);
UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(camera);
- if (priv->uca_trigger_mode == UCA_CAMERA_TRIGGER_SOFTWARE) {
+ if (priv->uca_trigger_source == UCA_CAMERA_TRIGGER_SOURCE_SOFTWARE) {
// TODO: wait for a signal from uca_camera_trigger()
}
guchar* fullFrame = dexela_grab();
- apply_software_roi(fullFrame, priv->width, priv->num_bytes, data, priv->roi_x, priv->roi_y, priv->roi_width, priv->roi_height);
+ apply_software_roi(fullFrame, real_width(priv), priv->num_bytes, data, priv->roi_x, priv->roi_y, priv->roi_width, priv->roi_height);
return TRUE;
}
@@ -390,12 +449,19 @@ static void uca_dexela_camera_finalize(GObject *object)
static gboolean uca_dexela_camera_initable_init(GInitable *initable, GCancellable *cancellable, GError **error)
{
g_return_val_if_fail (UCA_IS_DEXELA_CAMERA (initable), FALSE);
+ UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(initable);
if (cancellable != NULL) {
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Cancellable initialization not supported");
return FALSE;
}
+ if (priv->init_error != NULL) {
+ if (error) {
+ *error = g_error_copy (priv->init_error);
+ }
+ return FALSE;
+ }
return TRUE;
}
@@ -435,23 +501,33 @@ static void uca_dexela_camera_class_init(UcaDexelaCameraClass *klass)
g_type_class_add_private(klass, sizeof(UcaDexelaCameraPrivate));
}
-static void uca_dexela_camera_init(UcaDexelaCamera *self)
+static gboolean setup_dexela(UcaDexelaCameraPrivate *priv)
{
- UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(self);
- self->priv = priv;
- fill_binnings(priv);
- // TODO implement error checking
- dexela_open_detector(DEFAULT_FMT_FILE_PATH);
+ if (!dexela_open_detector(DEFAULT_FMT_FILE_PATH)) {
+ g_set_error_literal(&priv->init_error, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open dexela detector. Check cable, driver and permissions.");
+ return FALSE;
+ }
+ // TODO implement more error checking
dexela_init_serial_connection();
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->roi_width = real_width(priv);
+ priv->roi_height = real_height(priv);
priv->num_bytes = 2;
- priv->uca_trigger_mode = UCA_CAMERA_TRIGGER_AUTO;
+ return TRUE;
+}
+
+static void uca_dexela_camera_init(UcaDexelaCamera *self)
+{
+ UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(self);
+ self->priv = priv;
+ fill_binnings(priv);
+ priv->uca_trigger_source = UCA_CAMERA_TRIGGER_SOURCE_AUTO;
+ priv->uca_trigger_type = UCA_CAMERA_TRIGGER_TYPE_EDGE;
+ setup_dexela(priv);
}
G_MODULE_EXPORT GType
diff --git a/plugins/file/CMakeLists.txt b/plugins/file/CMakeLists.txt
index 3955366..41aa81c 100644
--- a/plugins/file/CMakeLists.txt
+++ b/plugins/file/CMakeLists.txt
@@ -5,9 +5,9 @@ find_package(TIFF)
if (TIFF_FOUND)
set(UCA_CAMERA_NAME "file")
- set(PLUGIN_VERSION "0.0.1")
- set(PLUGIN_REVISION "0")
- set(PLUGIN_REQUIRES "libuca >= 1.2.0")
+ set(PLUGIN_VERSION "0.0.2")
+ set(PLUGIN_REVISION "1")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0")
set(PLUGIN_SUMMARY "File plugin for libuca")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
diff --git a/plugins/mock/CMakeLists.txt b/plugins/mock/CMakeLists.txt
index df53b5b..a22616a 100644
--- a/plugins/mock/CMakeLists.txt
+++ b/plugins/mock/CMakeLists.txt
@@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 2.6)
project(ucamock C)
set(UCA_CAMERA_NAME "mock")
-set(PLUGIN_VERSION "1.0.1")
+set(PLUGIN_VERSION "1.0.2")
set(PLUGIN_REVISION "1")
-set(PLUGIN_REQUIRES "libuca >= 1.2.0")
+set(PLUGIN_REQUIRES "libuca >= 2.0.0")
set(PLUGIN_SUMMARY "Mock plugin for libuca")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
diff --git a/plugins/pco/CMakeLists.txt b/plugins/pco/CMakeLists.txt
index 04c2e16..e4cdcf4 100644
--- a/plugins/pco/CMakeLists.txt
+++ b/plugins/pco/CMakeLists.txt
@@ -7,9 +7,9 @@ find_package(ClSerSis)
if (PCO_FOUND)
set(UCA_CAMERA_NAME "pco")
- set(PLUGIN_VERSION "1.2.0")
+ set(PLUGIN_VERSION "1.2.1")
set(PLUGIN_REVISION "1")
- set(PLUGIN_REQUIRES "libuca >= 1.5.0")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0")
set(PLUGIN_SUMMARY "libpco plugin for libuca")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
diff --git a/plugins/pf/CMakeLists.txt b/plugins/pf/CMakeLists.txt
index 157c862..92be416 100644
--- a/plugins/pf/CMakeLists.txt
+++ b/plugins/pf/CMakeLists.txt
@@ -7,9 +7,9 @@ find_package(ClSerMe4)
if (PF_FOUND AND CLSERME4_FOUND AND FGLIB5_FOUND)
set(UCA_CAMERA_NAME "pco")
- set(PLUGIN_VERSION "1.0.0")
+ set(PLUGIN_VERSION "1.0.1")
set(PLUGIN_REVISION "1")
- set(PLUGIN_REQUIRES "libuca >= 1.2.0")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
${CMAKE_CURRENT_BINARY_DIR}/../../package-plugin-${UCA_CAMERA_NAME}.sh)
diff --git a/plugins/pylon/CMakeLists.txt b/plugins/pylon/CMakeLists.txt
index 69f668d..e2ace6b 100644
--- a/plugins/pylon/CMakeLists.txt
+++ b/plugins/pylon/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 2.6)
project(ucapylon C)
-set(VERSION "1.3.0")
+set(VERSION "1.4.0")
find_package(Pylon)
@@ -11,7 +11,7 @@ if (PYLON_FOUND)
set(PLUGIN_SUMMARY "Pylon plugin for libuca")
set(PLUGIN_CHANGELOG "${CMAKE_CURRENT_SOURCE_DIR}/changelog.txt")
set(PLUGIN_DESCRIPTION "Plugin for the Basler GigE CCD Camera.")
- set(PLUGIN_REQUIRES "libuca >= 1.3.0, libpyloncam >= 0.5.0")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0, libpyloncam >= 0.5.0")
set(PLUGIN_VENDOR "ANKA Computing Group")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
diff --git a/plugins/pylon/changelog.txt b/plugins/pylon/changelog.txt
index 7ce5fa8..ea5e9be 100644
--- a/plugins/pylon/changelog.txt
+++ b/plugins/pylon/changelog.txt
@@ -1,3 +1,7 @@
+* Mon May 18 2015 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.4.0-1
+- Update to libuca 2.0.0
+* Wed Oct 8 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.0-2
+- new revision for libuca 1.6.0
* Tue Oct 7 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.0-1
- require libpyloncam 0.5.0 because of new auto exposure feature
* Thu Sep 11 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.2.1-1
diff --git a/plugins/pylon/uca-pylon-camera.c b/plugins/pylon/uca-pylon-camera.c
index af6b8cf..0265ade 100644
--- a/plugins/pylon/uca-pylon-camera.c
+++ b/plugins/pylon/uca-pylon-camera.c
@@ -68,7 +68,7 @@ static gint base_overrideables[] = {
PROP_SENSOR_HORIZONTAL_BINNINGS,
PROP_SENSOR_VERTICAL_BINNING,
PROP_SENSOR_VERTICAL_BINNINGS,
- PROP_TRIGGER_MODE,
+ PROP_TRIGGER_SOURCE,
PROP_EXPOSURE_TIME,
PROP_ROI_X,
PROP_ROI_Y,
@@ -149,7 +149,8 @@ static void uca_pylon_camera_set_property(GObject *object, guint property_id, co
/* intentional fall-through*/
case PROP_SENSOR_VERTICAL_BINNING:
/* intentional fall-through*/
- case PROP_TRIGGER_MODE:
+ case PROP_TRIGGER_SOURCE:
+ /* this plugin supports AUTO triggering only ATM */
break;
case PROP_BALANCE_WHITE_AUTO:
{
@@ -262,8 +263,8 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
g_value_set_boxed(value, priv->binnings);
break;
- case PROP_TRIGGER_MODE:
- g_value_set_enum(value, UCA_CAMERA_TRIGGER_AUTO);
+ case PROP_TRIGGER_SOURCE:
+ g_value_set_enum(value, UCA_CAMERA_TRIGGER_SOURCE_AUTO);
break;
case PROP_HAS_STREAMING:
diff --git a/plugins/ufo/CMakeLists.txt b/plugins/ufo/CMakeLists.txt
index c5189b2..5872469 100644
--- a/plugins/ufo/CMakeLists.txt
+++ b/plugins/ufo/CMakeLists.txt
@@ -5,9 +5,9 @@ find_package(IPE)
if (IPE_FOUND)
set(UCA_CAMERA_NAME "ufo")
- set(PLUGIN_VERSION "1.0.1")
+ set(PLUGIN_VERSION "1.0.2")
set(PLUGIN_REVISION "1")
- set(PLUGIN_REQUIRES "libuca >= 1.2.0")
+ set(PLUGIN_REQUIRES "libuca >= 2.0.0")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in
${CMAKE_CURRENT_BINARY_DIR}/../../package-plugin-${UCA_CAMERA_NAME}.sh)