From b5c90a21f289bb67c4806a8563d96fc674bba583 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Tue, 24 Apr 2012 08:53:21 +0200
Subject: pylon (basler) camera added

---
 src/CMakeLists.txt             |  21 ++-
 src/cameras/pylon_camera.cpp   | 232 +++++++++++++++++++++++++++++++++
 src/cameras/pylon_camera.h     |  26 ++++
 src/cameras/uca-pylon-camera.c | 288 +++++++++++++++++++++++++++++++++++++++++
 src/cameras/uca-pylon-camera.h |  75 +++++++++++
 src/config.h.in                |   1 +
 src/uca-camera.c               |  11 ++
 7 files changed, 651 insertions(+), 3 deletions(-)
 create mode 100644 src/cameras/pylon_camera.cpp
 create mode 100644 src/cameras/pylon_camera.h
 create mode 100644 src/cameras/uca-pylon-camera.c
 create mode 100644 src/cameras/uca-pylon-camera.h

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 02a1005..5a3c014 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
 
 # --- Set sources -------------------------------------------------------------
 set(uca_SRCS
@@ -14,13 +15,14 @@ set(cameras)
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 # --- Find camera interfaces
-find_package(PCO)
+#find_package(PCO)
 find_package(PF)
 find_package(IPE)
+find_package(Pylon)
 
 # --- Find frame grabber interfaces
-find_package(FgLib5)
-find_package(ClSerMe4)
+#find_package(FgLib5)
+#find_package(ClSerMe4)
 
 # --- Miscellanous packages
 find_package(PkgConfig)
@@ -90,6 +92,19 @@ if (IPE_FOUND)
     endif()
 endif()
 
+if (PYLON_FOUND)
+  option(HAVE_PYLON_CAMERA "Camera: Pylon based (Basler)" ON)
+
+  if (HAVE_PYLON_CAMERA)
+    set(uca_SRCS ${uca_SRCS} cameras/uca-pylon-camera.c cameras/pylon_camera.cpp)
+    set(uca_HDRS ${uca_HDRS} cameras/uca-pylon-camera.h)
+    set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
+
+    include_directories(${PYLON_INCLUDE_DIRS})
+  endif()
+
+endif()
+
 if (HAVE_MOCK_CAMERA)
     list(APPEND uca_SRCS cameras/uca-mock-camera.c)
     list(APPEND uca_HDRS cameras/uca-mock-camera.h)
diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
new file mode 100644
index 0000000..eafcf06
--- /dev/null
+++ b/src/cameras/pylon_camera.cpp
@@ -0,0 +1,232 @@
+
+#include "pylon_camera.h"
+#include <yat/plugin/PlugInManager.h>
+#include <yat/threading/Condition.h>
+#include <baslerpylon/IGrabber.h>
+#include <iostream>
+
+namespace {
+
+  GrabAPI::IGrabber* pGrabber = 0;
+  //yat::Mutex* pImageMutex = NULL;
+  //yat::Condition* pImageCondition = NULL;
+  //yat::Mutex pImageMutex;
+  //yat::Condition pImageCondition(pImageMutex);
+  guint imageCounter = 0;
+  guint currentImage = 0;
+  GrabAPI::Image* image = NULL;
+
+  void handle_image(GrabAPI::Image* newImage)
+  {
+    //g_assert(pImageMutex);
+    //g_assert(pImageCondition);
+    //yat::MutexLock lock(pImageMutex);
+    delete image;
+    image = newImage;
+    imageCounter++;
+    std::cerr << "signal next image ready " << std::endl;
+    //pImageCondition.signal();
+  }
+
+  void yat_exception_to_gerror(const yat::Exception& e, GError** error)
+  {
+    if (e.errors.size() == 2)
+    {
+      g_set_error(error, 0, 0, 
+          "%s : %s : %s\n%s : %s : %s",
+          e.errors[0].reason.c_str(),
+          e.errors[0].desc.c_str(),
+          e.errors[0].origin.c_str(),
+          e.errors[1].reason.c_str(),
+          e.errors[1].desc.c_str(),
+          e.errors[1].origin.c_str());
+      return;
+    }
+    if (e.errors.size() == 3)
+    {
+      g_set_error(error, 0, 0, 
+          "%s : %s : %s\n%s : %s : %s\n%s : %s : %s",
+          e.errors[0].reason.c_str(),
+          e.errors[0].desc.c_str(),
+          e.errors[0].origin.c_str(),
+          e.errors[1].reason.c_str(),
+          e.errors[1].desc.c_str(),
+          e.errors[1].origin.c_str(),
+          e.errors[2].reason.c_str(),
+          e.errors[2].desc.c_str(),
+          e.errors[2].origin.c_str());
+      return;
+    }
+
+    g_set_error(error, 0, 0, 
+        "%s : %s : %s",
+        e.errors[0].reason.c_str(),
+        e.errors[0].desc.c_str(),
+        e.errors[0].origin.c_str());
+  }
+
+}
+
+
+void pylon_camera_new(const char* lib_path, const char* camera_ip, GError** error)
+{
+
+  g_assert(!pGrabber);
+  try {
+
+    //pImageMutex = new yat::Mutex;
+    //pImageCondition = new yat::Condition(*pImageMutex);
+
+    yat::PlugInManager pm;
+    std::pair<yat::IPlugInInfo*, yat::IPlugInFactory*> pp = 
+      pm.load((std::string(lib_path) + "/libbaslerpylon.so").c_str());
+
+    yat::IPlugInObject* plugin_obj = 0;
+    pp.second->create(plugin_obj);
+    pGrabber = static_cast<GrabAPI::IGrabber*>(plugin_obj);
+
+    yat::PlugInPropValues values;
+    values["CameraIP"] = yat::Any(std::string(camera_ip));
+    pGrabber->set_properties(values);
+    pGrabber->initialize();
+    pGrabber->set_image_handler(GrabAPI::ImageHandlerCallback::instanciate(handle_image));
+    pGrabber->open();
+
+  } 
+  catch (const yat::Exception& e) {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_set_exposure_time(gdouble exp_time, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    pGrabber->set_exposure_time(yat::Any(exp_time));
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_get_exposure_time(gdouble* exp_time, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    yat::Any exp_time_result;
+    pGrabber->get_exposure_time(exp_time_result);
+    *exp_time = yat::any_cast<gdouble>(exp_time_result);
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+
+void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    yat::Any w, h;
+    pGrabber->get_sensor_width(w);
+    pGrabber->get_sensor_height(h);
+    *width = yat::any_cast<yat_int32_t>(w);
+    *height = yat::any_cast<yat_int32_t>(h);
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_get_bit_depth(guint* depth, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    yat::Any bit_depth_result;
+    pGrabber->get_bit_depth(bit_depth_result);
+    *depth = yat::any_cast<yat_int32_t>(bit_depth_result);
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_start_acquision(GError** error)
+{
+  g_assert(pGrabber);
+  //g_assert(pImageMutex);
+  try
+  {
+    {
+      //yat::MutexLock lock(pImageMutex);
+      imageCounter = 0;
+      currentImage = 0;
+    }
+    pGrabber->start();
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_stop_acquision(GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    pGrabber->stop();
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_grab(gpointer *data, GError** error)
+{
+  g_assert(pGrabber);
+  //g_assert(pImageMutex);
+  //g_assert(pImageCondition);
+  sleep(1);
+  try
+  {
+      //yat::MutexLock lock(pImageMutex);
+      g_assert(currentImage <= imageCounter);
+
+      while (currentImage == imageCounter)
+      {
+        std::cerr << "wait for next image... " << currentImage << std::endl;
+        //pImageCondition.wait();
+      }
+
+      std::cerr << "grab next image " << currentImage << ", " << imageCounter << std::endl;
+      g_assert(currentImage < imageCounter);
+      currentImage = imageCounter;
+      //memcpy(*data, image->base(), image->width() * image->height() * 2);
+
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_delete()
+{
+  if (!pGrabber)
+    return;
+
+  pGrabber->close();
+  pGrabber->uninitialize();
+  delete pGrabber;
+}
+
diff --git a/src/cameras/pylon_camera.h b/src/cameras/pylon_camera.h
new file mode 100644
index 0000000..8a474aa
--- /dev/null
+++ b/src/cameras/pylon_camera.h
@@ -0,0 +1,26 @@
+
+#ifndef _PYLON_CAMERA_H_
+#define _PYLON_CAMERA_H_
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+void pylon_camera_new(const gchar* lib_path, const gchar* camera_ip, GError** error);
+
+void pylon_camera_set_exposure_time(gdouble exp_time, GError** error);
+void pylon_camera_get_exposure_time(gdouble* exp_time, GError** error);
+
+void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error);
+void pylon_camera_get_bit_depth(guint* depth, GError** error);
+
+void pylon_camera_start_acquision(GError** error);
+void pylon_camera_stop_acquision(GError** error);
+void pylon_camera_grab(gpointer *data, GError** error);
+
+void pylon_camera_delete();
+
+G_END_DECLS
+
+#endif
+
diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
new file mode 100644
index 0000000..82380bc
--- /dev/null
+++ b/src/cameras/uca-pylon-camera.c
@@ -0,0 +1,288 @@
+/* Copyright (C) 2011, 2012 Matthias Vogelgesang <matthias.vogelgesang@kit.edu>
+   (Karlsruhe Institute of Technology)
+
+   This library is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published by the
+   Free Software Foundation; either version 2.1 of the License, or (at your
+   option) any later version.
+
+   This library is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+   FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+   details.
+
+   You should have received a copy of the GNU Lesser General Public License along
+   with this library; if not, write to the Free Software Foundation, Inc., 51
+   Franklin St, Fifth Floor, Boston, MA 02110, USA */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "uca-camera.h"
+#include "uca-pylon-camera.h"
+#include "pylon_camera.h"
+
+
+/*#define HANDLE_PYLON_ERROR(err)                       \
+    if ((err) != PYLON_NOERROR) {                     \
+        g_set_error(error, UCA_PYLON_CAMERA_ERROR,    \
+                UCA_PYLON_CAMERA_ERROR_LIBPYLON_GENERAL,\
+                "libpylon error %i", err);            \
+        return;                                     \
+    }*/
+    
+#define UCA_PYLON_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_PYLON_CAMERA, UcaPylonCameraPrivate))
+
+G_DEFINE_TYPE(UcaPylonCamera, uca_pylon_camera, UCA_TYPE_CAMERA)
+
+/**
+ * UcapylonCameraError:
+ * @UCA_PYLON_CAMERA_ERROR_LIBPYLON_INIT: Initializing libpylon failed
+ * @UCA_PYLON_CAMERA_ERROR_LIBPYLON_GENERAL: General libpylon error
+ * @UCA_PYLON_CAMERA_ERROR_UNSUPPORTED: Camera type is not supported
+ * @UCA_PYLON_CAMERA_ERROR_FG_INIT: Framegrabber initialization failed
+ * @UCA_PYLON_CAMERA_ERROR_FG_GENERAL: General framegrabber error
+ * @UCA_PYLON_CAMERA_ERROR_FG_ACQUISITION: Framegrabber acquisition error
+ */
+GQuark uca_pylon_camera_error_quark()
+{
+    return g_quark_from_static_string("uca-pylon-camera-error-quark");
+}
+
+enum {
+    PROP_NAME = N_BASE_PROPERTIES,
+    N_PROPERTIES
+};
+
+static gint base_overrideables[] = {
+    PROP_SENSOR_WIDTH,
+    PROP_SENSOR_HEIGHT,
+    PROP_SENSOR_BITDEPTH,
+//    PROP_SENSOR_HORIZONTAL_BINNING,
+//    PROP_SENSOR_HORIZONTAL_BINNINGS,
+//    PROP_SENSOR_VERTICAL_BINNING,
+//    PROP_SENSOR_VERTICAL_BINNINGS,
+//    PROP_SENSOR_MAX_FRAME_RATE,
+//    PROP_ROI_X,
+//    PROP_ROI_Y,
+//    PROP_ROI_WIDTH,
+//    PROP_ROI_HEIGHT,
+//    PROP_HAS_STREAMING,
+//    PROP_HAS_CAMRAM_RECORDING,
+    0
+};
+
+
+static GParamSpec *pylon_properties[N_PROPERTIES] = { NULL, };
+
+
+struct _UcaPylonCameraPrivate {
+    guint frame_width;
+    guint frame_height;
+    guint bit_depth;
+    gsize num_bytes;
+
+    guint width;
+    guint height;
+};
+
+
+
+UcaPylonCamera *uca_pylon_camera_new(GError **error)
+{
+  UcaPylonCamera *camera = g_object_new(UCA_TYPE_PYLON_CAMERA, NULL);
+  UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
+
+  pylon_camera_new("/usr/local/lib64", "141.52.111.110", error);
+  if (*error) {
+    g_print("Error when calling pylon_camera_new %s\n", (*error)->message);
+    return NULL;
+  }
+
+  return camera;
+}
+
+static void uca_pylon_camera_start_recording(UcaCamera *camera, GError **error)
+{
+    g_return_if_fail(UCA_IS_PYLON_CAMERA(camera));
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
+
+    priv->num_bytes = 2;
+    pylon_camera_start_acquision(error);
+
+}
+
+static void uca_pylon_camera_stop_recording(UcaCamera *camera, GError **error)
+{
+    g_return_if_fail(UCA_IS_PYLON_CAMERA(camera));
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
+    pylon_camera_stop_acquision(error);
+}
+
+static void uca_pylon_camera_grab(UcaCamera *camera, gpointer *data, GError **error)
+{
+    g_return_if_fail(UCA_IS_PYLON_CAMERA(camera));
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
+
+    if (*data == NULL) {
+        *data = g_malloc0(priv->frame_width * priv->frame_height * priv->num_bytes); 
+    }
+    pylon_camera_grab(data, error);
+}
+
+static void uca_pylon_camera_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
+{
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+
+    switch (property_id) {
+        default:
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+            return;
+    }
+}
+
+static void uca_pylon_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
+{
+  printf("pylon_get_property\n");
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+    GError* error = NULL;
+
+    switch (property_id) {
+      
+        case PROP_SENSOR_WIDTH: 
+            pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
+            g_value_set_uint(value, priv->width);
+            printf("pylon_get_property sensor width %d\n", priv->width);
+            break;
+
+        case PROP_SENSOR_HEIGHT: 
+            pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
+            g_value_set_uint(value, priv->height);
+            printf("pylon_get_property sensor height %d\n", priv->height);
+            break;
+
+            /*
+        case PROP_SENSOR_MAX_FRAME_RATE:
+            g_value_set_float(value, priv->camera_description->max_frame_rate);
+            break;
+            */
+
+        case PROP_SENSOR_BITDEPTH:
+            pylon_camera_get_bit_depth(&priv->bit_depth, &error);
+            g_value_set_uint(value, priv->bit_depth);
+            printf("pylon_get_property depth %d\n", priv->bit_depth);
+            break;
+
+            /*
+        case PROP_HAS_STREAMING:
+            g_value_set_boolean(value, TRUE);
+            break;
+
+        case PROP_HAS_CAMRAM_RECORDING:
+            g_value_set_boolean(value, priv->camera_description->has_camram);
+            break;
+
+        case PROP_ROI_X:
+            {
+              guint16 roi[4] = {0};
+              guint err = pylon_get_roi(priv->pylon, roi);
+              g_value_set_uint(value, roi[0]);
+            }
+            break;
+
+        case PROP_ROI_Y:
+            {
+              guint16 roi[4] = {0};
+              guint err = pylon_get_roi(priv->pylon, roi);
+              g_value_set_uint(value, roi[1]);
+            }
+            break;
+
+        case PROP_ROI_WIDTH:
+            {
+              guint16 roi[4] = {0};
+              guint err = pylon_get_roi(priv->pylon, roi);
+              g_value_set_uint(value, (roi[2] - roi[0]));
+            }
+            break;
+
+        case PROP_ROI_HEIGHT:
+            {
+              guint16 roi[4] = {0};
+              guint err = pylon_get_roi(priv->pylon, roi);
+              g_value_set_uint(value, (roi[3] - roi[1]));
+            }
+            break;
+*/
+        case PROP_NAME: 
+            {
+                //char *name = NULL;
+                //pylon_get_name(priv->pylon, &name);
+                g_value_set_string(value, "TestName");
+                //free(name);
+            }
+            break;
+
+        default:
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+            break;
+    }
+}
+
+static void uca_pylon_camera_finalize(GObject *object)
+{
+    /*UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+
+    if (priv->horizontal_binnings)
+        g_value_array_free(priv->horizontal_binnings);
+
+    if (priv->vertical_binnings)
+        g_value_array_free(priv->vertical_binnings);
+
+    if (priv->fg) {
+        if (priv->fg_mem)
+            Fg_FreeMem(priv->fg, priv->fg_port);
+
+        Fg_FreeGrabber(priv->fg);
+    }
+
+    if (priv->pylon)
+        pylon_destroy(priv->pylon);
+        */
+
+    G_OBJECT_CLASS(uca_pylon_camera_parent_class)->finalize(object);
+}
+
+static void uca_pylon_camera_class_init(UcaPylonCameraClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+    gobject_class->set_property = uca_pylon_camera_set_property;
+    gobject_class->get_property = uca_pylon_camera_get_property;
+    gobject_class->finalize = uca_pylon_camera_finalize;
+
+    UcaCameraClass *camera_class = UCA_CAMERA_CLASS(klass);
+    camera_class->start_recording = uca_pylon_camera_start_recording;
+    camera_class->stop_recording = uca_pylon_camera_stop_recording;
+    camera_class->grab = uca_pylon_camera_grab;
+
+    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]]);
+
+    pylon_properties[PROP_NAME] = 
+        g_param_spec_string("name",
+            "Name of the camera",
+            "Name of the camera",
+            "", G_PARAM_READABLE);
+
+
+    for (guint id = N_BASE_PROPERTIES; id < N_PROPERTIES; id++)
+        g_object_class_install_property(gobject_class, id, pylon_properties[id]);
+
+    g_type_class_add_private(klass, sizeof(UcaPylonCameraPrivate));
+}
+
+static void uca_pylon_camera_init(UcaPylonCamera *self)
+{
+    self->priv = UCA_PYLON_CAMERA_GET_PRIVATE(self);
+}
+
diff --git a/src/cameras/uca-pylon-camera.h b/src/cameras/uca-pylon-camera.h
new file mode 100644
index 0000000..2f441dc
--- /dev/null
+++ b/src/cameras/uca-pylon-camera.h
@@ -0,0 +1,75 @@
+/* Copyright (C) 2011, 2012 Matthias Vogelgesang <matthias.vogelgesang@kit.edu>
+   (Karlsruhe Institute of Technology)
+
+   This library is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published by the
+   Free Software Foundation; either version 2.1 of the License, or (at your
+   option) any later version.
+
+   This library is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+   FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+   details.
+
+   You should have received a copy of the GNU Lesser General Public License along
+   with this library; if not, write to the Free Software Foundation, Inc., 51
+   Franklin St, Fifth Floor, Boston, MA 02110, USA */
+
+#ifndef __UCA_PYLON_CAMERA_H
+#define __UCA_PYLON_CAMERA_H
+
+#include <glib-object.h>
+
+#include "uca-camera.h"
+
+G_BEGIN_DECLS
+
+#define UCA_TYPE_PYLON_CAMERA             (uca_pylon_camera_get_type())
+#define UCA_PYLON_CAMERA(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_PYLON_CAMERA, UcaPylonCamera))
+#define UCA_IS_PYLON_CAMERA(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_PYLON_CAMERA))
+#define UCA_PYLON_CAMERA_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), UFO_TYPE_PYLON_CAMERA, UfoPylonCameraClass))
+#define UCA_IS_PYLON_CAMERA_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_PYLON_CAMERA))
+#define UCA_PYLON_CAMERA_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_PYLON_CAMERA, UcaPylonCameraClass))
+
+#define UCA_PYLON_CAMERA_ERROR uca_pylon_camera_error_quark()
+typedef enum {
+    UCA_PYLON_CAMERA_ERROR_LIBPYLON_INIT,
+    UCA_PYLON_CAMERA_ERROR_LIBPYLON_GENERAL,
+    UCA_PYLON_CAMERA_ERROR_UNSUPPORTED,
+} UcaPylonCameraError;
+
+typedef struct _UcaPylonCamera           UcaPylonCamera;
+typedef struct _UcaPylonCameraClass      UcaPylonCameraClass;
+typedef struct _UcaPylonCameraPrivate    UcaPylonCameraPrivate;
+
+/**
+ * UcaPylonCamera:
+ *
+ * Creates #UcaPylonCamera instances by loading corresponding shared objects. The
+ * contents of the #UcaPylonCamera structure are private and should only be
+ * accessed via the provided API.
+ */
+struct _UcaPylonCamera {
+    /*< private >*/
+    UcaCamera parent;
+
+    UcaPylonCameraPrivate *priv;
+};
+
+/**
+ * UcaPylonCameraClass:
+ *
+ * #UcaPylonCamera class
+ */
+struct _UcaPylonCameraClass {
+    /*< private >*/
+    UcaCameraClass parent;
+};
+
+UcaPylonCamera *uca_pylon_camera_new(GError **error);
+
+GType uca_pylon_camera_get_type(void);
+
+G_END_DECLS
+
+#endif
diff --git a/src/config.h.in b/src/config.h.in
index 0b1dde9..e3911a1 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -2,6 +2,7 @@
 #cmakedefine HAVE_PHOTON_FOCUS
 #cmakedefine HAVE_PHOTRON_FASTCAM
 #cmakedefine HAVE_UFO_CAMERA
+#cmakedefine HAVE_PYLON_CAMERA
 
 #cmakedefine HAVE_MOCK_CAMERA
 #define CONTROL_GLADE_PATH "${CMAKE_INSTALL_PREFIX}/share/libuca/control.glade"
diff --git a/src/uca-camera.c b/src/uca-camera.c
index 1584569..602a3c4 100644
--- a/src/uca-camera.c
+++ b/src/uca-camera.c
@@ -24,6 +24,10 @@
 #include "cameras/uca-pco-camera.h"
 #endif
 
+#ifdef HAVE_PYLON_CAMERA
+#include "cameras/uca-pylon-camera.h"
+#endif
+
 #ifdef HAVE_MOCK_CAMERA
 #include "cameras/uca-mock-camera.h"
 #endif
@@ -65,6 +69,9 @@ static gchar *uca_camera_types[] = {
 #ifdef HAVE_PCO_CL
         "pco",
 #endif
+#ifdef HAVE_PYLON_CAMERA
+        "pylon",
+#endif
 #ifdef HAVE_MOCK_CAMERA
         "mock",
 #endif
@@ -418,6 +425,10 @@ UcaCamera *uca_camera_new(const gchar *type, GError **error)
 
     camera = uca_camera_new_from_type(type, &tmp_error);
 
+#ifdef HAVE_PYLON_CAMERA
+    if (!g_strcmp0(type, "pylon"))
+        camera = UCA_CAMERA(uca_pylon_camera_new(&tmp_error));
+#endif
     if (tmp_error != NULL) {
         g_propagate_error(error, tmp_error);
         return NULL;
-- 
cgit v1.2.3


From 38d6d18e83b0c33a18ef6f68c22c161d39abc449 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Tue, 8 May 2012 14:49:11 +0200
Subject: basler camera works

---
 src/CMakeLists.txt             |  7 ++++---
 src/cameras/pylon_camera.cpp   | 34 +++++++++++-----------------------
 src/cameras/uca-pylon-camera.c | 20 +++++++++++---------
 src/cameras/uca-pylon-camera.h |  1 -
 4 files changed, 26 insertions(+), 36 deletions(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5a3c014..9630a72 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,14 +15,14 @@ set(cameras)
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 # --- Find camera interfaces
-#find_package(PCO)
+find_package(PCO)
 find_package(PF)
 find_package(IPE)
 find_package(Pylon)
 
 # --- Find frame grabber interfaces
-#find_package(FgLib5)
-#find_package(ClSerMe4)
+find_package(FgLib5)
+find_package(ClSerMe4)
 
 # --- Miscellanous packages
 find_package(PkgConfig)
@@ -101,6 +101,7 @@ if (PYLON_FOUND)
     set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
 
     include_directories(${PYLON_INCLUDE_DIRS})
+    link_directories(/opt/pylon/lib64)
   endif()
 
 endif()
diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
index eafcf06..d27b6c4 100644
--- a/src/cameras/pylon_camera.cpp
+++ b/src/cameras/pylon_camera.cpp
@@ -8,24 +8,19 @@
 namespace {
 
   GrabAPI::IGrabber* pGrabber = 0;
-  //yat::Mutex* pImageMutex = NULL;
-  //yat::Condition* pImageCondition = NULL;
-  //yat::Mutex pImageMutex;
-  //yat::Condition pImageCondition(pImageMutex);
+  yat::Mutex pImageMutex;
+  yat::Condition pImageCondition(pImageMutex);
   guint imageCounter = 0;
   guint currentImage = 0;
   GrabAPI::Image* image = NULL;
 
   void handle_image(GrabAPI::Image* newImage)
   {
-    //g_assert(pImageMutex);
-    //g_assert(pImageCondition);
-    //yat::MutexLock lock(pImageMutex);
+    yat::MutexLock lock(pImageMutex);
     delete image;
     image = newImage;
     imageCounter++;
-    std::cerr << "signal next image ready " << std::endl;
-    //pImageCondition.signal();
+    pImageCondition.signal();
   }
 
   void yat_exception_to_gerror(const yat::Exception& e, GError** error)
@@ -70,13 +65,9 @@ namespace {
 
 void pylon_camera_new(const char* lib_path, const char* camera_ip, GError** error)
 {
-
   g_assert(!pGrabber);
   try {
 
-    //pImageMutex = new yat::Mutex;
-    //pImageCondition = new yat::Condition(*pImageMutex);
-
     yat::PlugInManager pm;
     std::pair<yat::IPlugInInfo*, yat::IPlugInFactory*> pp = 
       pm.load((std::string(lib_path) + "/libbaslerpylon.so").c_str());
@@ -91,7 +82,6 @@ void pylon_camera_new(const char* lib_path, const char* camera_ip, GError** erro
     pGrabber->initialize();
     pGrabber->set_image_handler(GrabAPI::ImageHandlerCallback::instanciate(handle_image));
     pGrabber->open();
-
   } 
   catch (const yat::Exception& e) {
     yat_exception_to_gerror(e, error);
@@ -146,6 +136,7 @@ void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error)
 
 void pylon_camera_get_bit_depth(guint* depth, GError** error)
 {
+  std::cerr << __func__ << std::endl;
   g_assert(pGrabber);
   try
   {
@@ -162,11 +153,10 @@ void pylon_camera_get_bit_depth(guint* depth, GError** error)
 void pylon_camera_start_acquision(GError** error)
 {
   g_assert(pGrabber);
-  //g_assert(pImageMutex);
   try
   {
     {
-      //yat::MutexLock lock(pImageMutex);
+      yat::MutexLock lock(pImageMutex);
       imageCounter = 0;
       currentImage = 0;
     }
@@ -194,24 +184,22 @@ void pylon_camera_stop_acquision(GError** error)
 void pylon_camera_grab(gpointer *data, GError** error)
 {
   g_assert(pGrabber);
-  //g_assert(pImageMutex);
-  //g_assert(pImageCondition);
-  sleep(1);
   try
   {
-      //yat::MutexLock lock(pImageMutex);
+      yat::MutexLock lock(pImageMutex);
       g_assert(currentImage <= imageCounter);
 
       while (currentImage == imageCounter)
       {
         std::cerr << "wait for next image... " << currentImage << std::endl;
-        //pImageCondition.wait();
+        pImageCondition.wait();
       }
 
-      std::cerr << "grab next image " << currentImage << ", " << imageCounter << std::endl;
+      std::cerr << "grab next image " << currentImage << ", " << imageCounter 
+        << "; width: " << image->width() << ", height: " << image->height() << std::endl;
       g_assert(currentImage < imageCounter);
       currentImage = imageCounter;
-      //memcpy(*data, image->base(), image->width() * image->height() * 2);
+      memcpy(*data, image->base(), image->width() * image->height() * 2);
 
   }
   catch (const yat::Exception& e)
diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 82380bc..1bc8ee2 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -77,8 +77,6 @@ static GParamSpec *pylon_properties[N_PROPERTIES] = { NULL, };
 
 
 struct _UcaPylonCameraPrivate {
-    guint frame_width;
-    guint frame_height;
     guint bit_depth;
     gsize num_bytes;
 
@@ -99,6 +97,11 @@ UcaPylonCamera *uca_pylon_camera_new(GError **error)
     return NULL;
   }
 
+  pylon_camera_get_sensor_size(&priv->width, &priv->height, error);
+  if (*error) {
+    g_print("Error when calling pylon_camera_get_sensor_size %s\n", (*error)->message);
+    return NULL;
+  }
   return camera;
 }
 
@@ -115,7 +118,6 @@ static void uca_pylon_camera_start_recording(UcaCamera *camera, GError **error)
 static void uca_pylon_camera_stop_recording(UcaCamera *camera, GError **error)
 {
     g_return_if_fail(UCA_IS_PYLON_CAMERA(camera));
-    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
     pylon_camera_stop_acquision(error);
 }
 
@@ -125,14 +127,14 @@ static void uca_pylon_camera_grab(UcaCamera *camera, gpointer *data, GError **er
     UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(camera);
 
     if (*data == NULL) {
-        *data = g_malloc0(priv->frame_width * priv->frame_height * priv->num_bytes); 
+        *data = g_malloc0(priv->width * priv->height * priv->num_bytes); 
     }
     pylon_camera_grab(data, error);
 }
 
 static void uca_pylon_camera_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
 {
-    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+    /*UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);*/
 
     switch (property_id) {
         default:
@@ -143,7 +145,7 @@ static void uca_pylon_camera_set_property(GObject *object, guint property_id, co
 
 static void uca_pylon_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
 {
-  printf("pylon_get_property\n");
+  fprintf(stderr, "pylon_get_property\n");
     UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
     GError* error = NULL;
 
@@ -152,13 +154,13 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
         case PROP_SENSOR_WIDTH: 
             pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
             g_value_set_uint(value, priv->width);
-            printf("pylon_get_property sensor width %d\n", priv->width);
+            g_print("pylon_get_property sensor width %d\n", priv->width);
             break;
 
         case PROP_SENSOR_HEIGHT: 
             pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
             g_value_set_uint(value, priv->height);
-            printf("pylon_get_property sensor height %d\n", priv->height);
+            g_print("pylon_get_property sensor height %d\n", priv->height);
             break;
 
             /*
@@ -170,7 +172,7 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
         case PROP_SENSOR_BITDEPTH:
             pylon_camera_get_bit_depth(&priv->bit_depth, &error);
             g_value_set_uint(value, priv->bit_depth);
-            printf("pylon_get_property depth %d\n", priv->bit_depth);
+            g_print("pylon_get_property depth %d\n", priv->bit_depth);
             break;
 
             /*
diff --git a/src/cameras/uca-pylon-camera.h b/src/cameras/uca-pylon-camera.h
index 2f441dc..eebf63c 100644
--- a/src/cameras/uca-pylon-camera.h
+++ b/src/cameras/uca-pylon-camera.h
@@ -19,7 +19,6 @@
 #define __UCA_PYLON_CAMERA_H
 
 #include <glib-object.h>
-
 #include "uca-camera.h"
 
 G_BEGIN_DECLS
-- 
cgit v1.2.3


From 9395f3ed8c69c7873c187d8a93b4755b685b3c96 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Tue, 26 Jun 2012 08:53:11 +0200
Subject: working on basler

---
 src/CMakeLists.txt           |  5 +++--
 src/cameras/pylon_camera.cpp | 12 +++++++++---
 src/scangobj.sh.in           |  2 +-
 3 files changed, 13 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9630a72..46bcfb2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,7 +15,7 @@ set(cameras)
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 # --- Find camera interfaces
-find_package(PCO)
+#find_package(PCO)
 find_package(PF)
 find_package(IPE)
 find_package(Pylon)
@@ -99,6 +99,7 @@ if (PYLON_FOUND)
     set(uca_SRCS ${uca_SRCS} cameras/uca-pylon-camera.c cameras/pylon_camera.cpp)
     set(uca_HDRS ${uca_HDRS} cameras/uca-pylon-camera.h)
     set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
+    #list(APPEND cameras "Pylon")
 
     include_directories(${PYLON_INCLUDE_DIRS})
     link_directories(/opt/pylon/lib64)
@@ -241,7 +242,7 @@ if(GTK_DOC_FOUND)
             DEPENDS ${docs_out}/sgml.stamp ${docs_out}/uca-docs.xml
             WORKING_DIRECTORY ${docs_out})
 
-        add_custom_target(reference ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/html.stamp)
+        add_custom_target(reference DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/html.stamp)
 
         install(FILES ${reference_files} DESTINATION share/gtk-doc/html/uca)
     endif()
diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
index d27b6c4..71aede4 100644
--- a/src/cameras/pylon_camera.cpp
+++ b/src/cameras/pylon_camera.cpp
@@ -13,6 +13,7 @@ namespace {
   guint imageCounter = 0;
   guint currentImage = 0;
   GrabAPI::Image* image = NULL;
+  guint bytesPerPixel = 0;
 
   void handle_image(GrabAPI::Image* newImage)
   {
@@ -136,7 +137,6 @@ void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error)
 
 void pylon_camera_get_bit_depth(guint* depth, GError** error)
 {
-  std::cerr << __func__ << std::endl;
   g_assert(pGrabber);
   try
   {
@@ -153,6 +153,12 @@ void pylon_camera_get_bit_depth(guint* depth, GError** error)
 void pylon_camera_start_acquision(GError** error)
 {
   g_assert(pGrabber);
+  guint bit_depth = 0;
+  pylon_camera_get_bit_depth(&bit_depth, error);
+  bytesPerPixel = 1;
+  if (bit_depth > 8) bytesPerPixel = 2;
+  if (bit_depth > 16) bytesPerPixel = 3;
+  if (bit_depth > 24) bytesPerPixel = 4;
   try
   {
     {
@@ -196,10 +202,10 @@ void pylon_camera_grab(gpointer *data, GError** error)
       }
 
       std::cerr << "grab next image " << currentImage << ", " << imageCounter 
-        << "; width: " << image->width() << ", height: " << image->height() << std::endl;
+        << "; width: " << image->width() / bytesPerPixel << ", height: " << image->height() << std::endl;
       g_assert(currentImage < imageCounter);
       currentImage = imageCounter;
-      memcpy(*data, image->base(), image->width() * image->height() * 2);
+      memcpy(*data, image->base(), image->width() * image->height());
 
   }
   catch (const yat::Exception& e)
diff --git a/src/scangobj.sh.in b/src/scangobj.sh.in
index 4a4e330..65766b6 100644
--- a/src/scangobj.sh.in
+++ b/src/scangobj.sh.in
@@ -1 +1 @@
-LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR} CC=gcc CFLAGS="${GTK_DOC_CFLAGS}" LDFLAGS="${GTK_DOC_LDFLAGS} -L${CMAKE_CURRENT_BINARY_DIR} -L${CMAKE_CURRENT_BINARY_DIR} -luca `pkg-config --libs gtk+-2.0`" gtkdoc-scangobj --module=uca
+LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}:/opt/pylon/lib64:/opt/pylon/genicam/bin/Linux64_x64 CC=gcc CFLAGS="${GTK_DOC_CFLAGS}" LDFLAGS="${GTK_DOC_LDFLAGS} -L${CMAKE_CURRENT_BINARY_DIR} -L${CMAKE_CURRENT_BINARY_DIR} -luca `pkg-config --libs gtk+-2.0`" gtkdoc-scangobj --module=uca
-- 
cgit v1.2.3


From 67e3daeb2ad9d9835c4e19a1edd744cba92b83d1 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 26 Jul 2012 09:12:00 +0200
Subject: SCHNEIDE-255 (ROI support basler)

---
 src/CMakeLists.txt             | 12 +++----
 src/cameras/pylon_camera.cpp   | 35 ++++++++++++++++++
 src/cameras/pylon_camera.h     |  3 ++
 src/cameras/uca-pylon-camera.c | 82 +++++++++++++++++++++++++++++++-----------
 4 files changed, 105 insertions(+), 27 deletions(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 46bcfb2..931ca9b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -96,13 +96,13 @@ if (PYLON_FOUND)
   option(HAVE_PYLON_CAMERA "Camera: Pylon based (Basler)" ON)
 
   if (HAVE_PYLON_CAMERA)
-    set(uca_SRCS ${uca_SRCS} cameras/uca-pylon-camera.c cameras/pylon_camera.cpp)
-    set(uca_HDRS ${uca_HDRS} cameras/uca-pylon-camera.h)
-    set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
-    #list(APPEND cameras "Pylon")
+        list(APPEND uca_SRCS cameras/uca-pylon-camera.c cameras/pylon_camera.cpp)
+        list(APPEND uca_HDRS cameras/uca-pylon-camera.h)
+        list(APPEND cameras "Pylon")
+        set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
 
-    include_directories(${PYLON_INCLUDE_DIRS})
-    link_directories(/opt/pylon/lib64)
+        include_directories(${PYLON_INCLUDE_DIRS})
+        link_directories(/opt/pylon/lib64)
   endif()
 
 endif()
diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
index 71aede4..b73bc18 100644
--- a/src/cameras/pylon_camera.cpp
+++ b/src/cameras/pylon_camera.cpp
@@ -150,6 +150,41 @@ void pylon_camera_get_bit_depth(guint* depth, GError** error)
   }
 }
 
+void pylon_camera_get_roi(guint16* roi_x, guint16* roi_y, guint16* roi_width, guint16* roi_height, GError** error)
+{
+  g_assert(pGrabber);
+  g_assert(roi_x);
+  g_assert(roi_y);
+  g_assert(roi_width);
+  g_assert(roi_height);
+  try
+  {
+    GrabAPI::ROI roi = pGrabber->get_roi();
+    *roi_x = roi.x;
+    *roi_y = roi.y;
+    *roi_width = roi.width;
+    *roi_height = roi.height;
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint16 roi_height, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    GrabAPI::ROI roi(roi_x, roi_y, roi_width, roi_height);
+    pGrabber->set_roi(roi);
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
 void pylon_camera_start_acquision(GError** error)
 {
   g_assert(pGrabber);
diff --git a/src/cameras/pylon_camera.h b/src/cameras/pylon_camera.h
index 8a474aa..f5c7cdc 100644
--- a/src/cameras/pylon_camera.h
+++ b/src/cameras/pylon_camera.h
@@ -14,6 +14,9 @@ void pylon_camera_get_exposure_time(gdouble* exp_time, GError** error);
 void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error);
 void pylon_camera_get_bit_depth(guint* depth, GError** error);
 
+void pylon_camera_get_roi(guint16* roi_x, guint16* roi_y, guint16* roi_width, guint16* roi_height, GError** error);
+void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint16 roi_height, GError** error);
+
 void pylon_camera_start_acquision(GError** error);
 void pylon_camera_stop_acquision(GError** error);
 void pylon_camera_grab(gpointer *data, GError** error);
diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 1bc8ee2..c8fa073 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -50,11 +50,11 @@ GQuark uca_pylon_camera_error_quark()
 }
 
 enum {
-    PROP_NAME = N_BASE_PROPERTIES,
-    N_PROPERTIES
+    N_PROPERTIES = N_BASE_PROPERTIES
 };
 
 static gint base_overrideables[] = {
+    PROP_NAME,
     PROP_SENSOR_WIDTH,
     PROP_SENSOR_HEIGHT,
     PROP_SENSOR_BITDEPTH,
@@ -63,10 +63,10 @@ static gint base_overrideables[] = {
 //    PROP_SENSOR_VERTICAL_BINNING,
 //    PROP_SENSOR_VERTICAL_BINNINGS,
 //    PROP_SENSOR_MAX_FRAME_RATE,
-//    PROP_ROI_X,
-//    PROP_ROI_Y,
-//    PROP_ROI_WIDTH,
-//    PROP_ROI_HEIGHT,
+    PROP_ROI_X,
+    PROP_ROI_Y,
+    PROP_ROI_WIDTH,
+    PROP_ROI_HEIGHT,
 //    PROP_HAS_STREAMING,
 //    PROP_HAS_CAMRAM_RECORDING,
     0
@@ -82,9 +82,22 @@ struct _UcaPylonCameraPrivate {
 
     guint width;
     guint height;
+    guint16 roi_x, roi_y;
+    guint16 roi_width, roi_height;
 };
 
 
+static void pylon_get_roi(GObject *object, GError** error)
+{
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+    pylon_camera_get_roi(&priv->roi_x, &priv->roi_y, &priv->roi_width, &priv->roi_height, error);
+}
+
+static void pylon_set_roi(GObject *object, GError** error)
+{
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+    pylon_camera_set_roi(priv->roi_x, priv->roi_y, priv->roi_width, priv->roi_height, error);
+}
 
 UcaPylonCamera *uca_pylon_camera_new(GError **error)
 {
@@ -134,9 +147,39 @@ static void uca_pylon_camera_grab(UcaCamera *camera, gpointer *data, GError **er
 
 static void uca_pylon_camera_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
 {
-    /*UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);*/
+    UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+    GError* error = NULL;
 
     switch (property_id) {
+
+        case PROP_ROI_X:
+            {
+              priv->roi_x = g_value_get_uint(value);
+              pylon_set_roi(object, &error);
+            }
+            break;
+
+        case PROP_ROI_Y:
+            {
+              priv->roi_y = g_value_get_uint(value);
+              pylon_set_roi(object, &error);
+            }
+            break;
+
+        case PROP_ROI_WIDTH:
+            {
+              priv->roi_width = g_value_get_uint(value);
+              pylon_set_roi(object, &error);
+            }
+            break;
+
+        case PROP_ROI_HEIGHT:
+            {
+              priv->roi_height = g_value_get_uint(value);
+              pylon_set_roi(object, &error);
+            }
+            break;
+
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
             return;
@@ -183,44 +226,41 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
         case PROP_HAS_CAMRAM_RECORDING:
             g_value_set_boolean(value, priv->camera_description->has_camram);
             break;
+            */
 
         case PROP_ROI_X:
             {
-              guint16 roi[4] = {0};
-              guint err = pylon_get_roi(priv->pylon, roi);
-              g_value_set_uint(value, roi[0]);
+              pylon_get_roi(object, &error);
+              g_value_set_uint(value, priv->roi_x);
             }
             break;
 
         case PROP_ROI_Y:
             {
-              guint16 roi[4] = {0};
-              guint err = pylon_get_roi(priv->pylon, roi);
-              g_value_set_uint(value, roi[1]);
+              pylon_get_roi(object, &error);
+              g_value_set_uint(value, priv->roi_y);
             }
             break;
 
         case PROP_ROI_WIDTH:
             {
-              guint16 roi[4] = {0};
-              guint err = pylon_get_roi(priv->pylon, roi);
-              g_value_set_uint(value, (roi[2] - roi[0]));
+              pylon_get_roi(object, &error);
+              g_value_set_uint(value, priv->roi_width);
             }
             break;
 
         case PROP_ROI_HEIGHT:
             {
-              guint16 roi[4] = {0};
-              guint err = pylon_get_roi(priv->pylon, roi);
-              g_value_set_uint(value, (roi[3] - roi[1]));
+              pylon_get_roi(object, &error);
+              g_value_set_uint(value, priv->roi_height);
             }
             break;
-*/
+
         case PROP_NAME: 
             {
                 //char *name = NULL;
                 //pylon_get_name(priv->pylon, &name);
-                g_value_set_string(value, "TestName");
+                g_value_set_string(value, "Pylon Camera");
                 //free(name);
             }
             break;
-- 
cgit v1.2.3


From 33dd061f219c0490c1e22c391d2b8aca8fc4f5cd Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 26 Jul 2012 09:37:22 +0200
Subject: SCHNEIDE-346 (exposure time)

---
 src/cameras/uca-pylon-camera.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

(limited to 'src')

diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index c8fa073..3b37c20 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -58,17 +58,11 @@ static gint base_overrideables[] = {
     PROP_SENSOR_WIDTH,
     PROP_SENSOR_HEIGHT,
     PROP_SENSOR_BITDEPTH,
-//    PROP_SENSOR_HORIZONTAL_BINNING,
-//    PROP_SENSOR_HORIZONTAL_BINNINGS,
-//    PROP_SENSOR_VERTICAL_BINNING,
-//    PROP_SENSOR_VERTICAL_BINNINGS,
-//    PROP_SENSOR_MAX_FRAME_RATE,
+    PROP_EXPOSURE_TIME,
     PROP_ROI_X,
     PROP_ROI_Y,
     PROP_ROI_WIDTH,
     PROP_ROI_HEIGHT,
-//    PROP_HAS_STREAMING,
-//    PROP_HAS_CAMRAM_RECORDING,
     0
 };
 
@@ -180,6 +174,12 @@ static void uca_pylon_camera_set_property(GObject *object, guint property_id, co
             }
             break;
 
+        case PROP_EXPOSURE_TIME:
+            {
+              pylon_camera_set_exposure_time(g_value_get_double(value), &error);
+            }
+            break;
+
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
             return;
@@ -256,6 +256,14 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
             }
             break;
 
+        case PROP_EXPOSURE_TIME:
+            {
+              gdouble exp_time = 0.0;
+              pylon_camera_get_exposure_time(&exp_time, &error);
+              g_value_set_double(value, exp_time);
+            }
+            break;
+
         case PROP_NAME: 
             {
                 //char *name = NULL;
-- 
cgit v1.2.3


From a8d04f213275d2de122f27f2471b6d47850c77fd Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 26 Jul 2012 11:10:27 +0200
Subject: SCHNEIDE-347 (standardattribute)

---
 src/cameras/uca-pylon-camera.c | 71 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 61 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 3b37c20..44b0e57 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -58,11 +58,21 @@ static gint base_overrideables[] = {
     PROP_SENSOR_WIDTH,
     PROP_SENSOR_HEIGHT,
     PROP_SENSOR_BITDEPTH,
+    PROP_SENSOR_HORIZONTAL_BINNING,
+    PROP_SENSOR_HORIZONTAL_BINNINGS,
+    PROP_SENSOR_VERTICAL_BINNING,
+    PROP_SENSOR_VERTICAL_BINNINGS,
+    PROP_SENSOR_MAX_FRAME_RATE,
+    PROP_TRIGGER_MODE,
     PROP_EXPOSURE_TIME,
     PROP_ROI_X,
     PROP_ROI_Y,
     PROP_ROI_WIDTH,
     PROP_ROI_HEIGHT,
+    PROP_ROI_WIDTH_MULTIPLIER,
+    PROP_ROI_HEIGHT_MULTIPLIER,
+    PROP_HAS_STREAMING,
+    PROP_HAS_CAMRAM_RECORDING,
     0
 };
 
@@ -78,6 +88,7 @@ struct _UcaPylonCameraPrivate {
     guint height;
     guint16 roi_x, roi_y;
     guint16 roi_width, roi_height;
+    GValueArray *binnings;
 };
 
 
@@ -146,6 +157,13 @@ static void uca_pylon_camera_set_property(GObject *object, guint property_id, co
 
     switch (property_id) {
 
+        case PROP_SENSOR_HORIZONTAL_BINNING:
+          /* intentional fall-through*/
+        case PROP_SENSOR_VERTICAL_BINNING:
+          /* intentional fall-through*/
+        case PROP_TRIGGER_MODE:
+          break;
+
         case PROP_ROI_X:
             {
               priv->roi_x = g_value_get_uint(value);
@@ -206,27 +224,43 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
             g_print("pylon_get_property sensor height %d\n", priv->height);
             break;
 
-            /*
-        case PROP_SENSOR_MAX_FRAME_RATE:
-            g_value_set_float(value, priv->camera_description->max_frame_rate);
-            break;
-            */
-
         case PROP_SENSOR_BITDEPTH:
             pylon_camera_get_bit_depth(&priv->bit_depth, &error);
             g_value_set_uint(value, priv->bit_depth);
             g_print("pylon_get_property depth %d\n", priv->bit_depth);
             break;
 
-            /*
+        case PROP_SENSOR_HORIZONTAL_BINNING:
+            g_value_set_uint(value, 1);
+            break;
+
+        case PROP_SENSOR_HORIZONTAL_BINNINGS:
+            g_value_set_boxed(value, priv->binnings);
+            break;
+
+        case PROP_SENSOR_VERTICAL_BINNING:
+            g_value_set_uint(value, 1);
+            break;
+
+        case PROP_SENSOR_VERTICAL_BINNINGS:
+            g_value_set_boxed(value, priv->binnings);
+            break;
+
+        case PROP_SENSOR_MAX_FRAME_RATE:
+            g_value_set_float(value, 0.0);
+            break;
+
+        case PROP_TRIGGER_MODE:
+            g_value_set_enum(value, UCA_CAMERA_TRIGGER_AUTO);
+            break;
+
         case PROP_HAS_STREAMING:
-            g_value_set_boolean(value, TRUE);
+            g_value_set_boolean(value, FALSE);
             break;
 
         case PROP_HAS_CAMRAM_RECORDING:
-            g_value_set_boolean(value, priv->camera_description->has_camram);
+            g_value_set_boolean(value, FALSE);
             break;
-            */
 
         case PROP_ROI_X:
             {
@@ -256,6 +290,14 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
             }
             break;
 
+        case PROP_ROI_WIDTH_MULTIPLIER:
+            g_value_set_uint(value, 1);
+            break;
+
+        case PROP_ROI_HEIGHT_MULTIPLIER:
+            g_value_set_uint(value, 1);
+            break;
+
         case PROP_EXPOSURE_TIME:
             {
               gdouble exp_time = 0.0;
@@ -281,6 +323,8 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
 
 static void uca_pylon_camera_finalize(GObject *object)
 {
+  UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
+  g_value_array_free(priv->binnings);
     /*UcaPylonCameraPrivate *priv = UCA_PYLON_CAMERA_GET_PRIVATE(object);
 
     if (priv->horizontal_binnings)
@@ -334,5 +378,12 @@ static void uca_pylon_camera_class_init(UcaPylonCameraClass *klass)
 static void uca_pylon_camera_init(UcaPylonCamera *self)
 {
     self->priv = UCA_PYLON_CAMERA_GET_PRIVATE(self);
+
+    /* binnings */
+    GValue val = {0};
+    g_value_init(&val, G_TYPE_UINT);
+    g_value_set_uint(&val, 1);
+    self->priv->binnings  = g_value_array_new(1);
+    g_value_array_append(self->priv->binnings, &val);
 }
 
-- 
cgit v1.2.3


From c16b7cccb72374be1ad6aed2310c137dc4ed4e0c Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 26 Jul 2012 14:42:07 +0200
Subject: SCHNEIDE-348

---
 src/cameras/uca-pylon-camera.c | 57 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 44b0e57..152ff01 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -50,7 +50,9 @@ GQuark uca_pylon_camera_error_quark()
 }
 
 enum {
-    N_PROPERTIES = N_BASE_PROPERTIES
+    PROP_ROI_WIDTH_DEFAULT = N_BASE_PROPERTIES,
+    PROP_ROI_HEIGHT_DEFAULT,
+    N_PROPERTIES 
 };
 
 static gint base_overrideables[] = {
@@ -290,6 +292,16 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
             }
             break;
 
+        case PROP_ROI_WIDTH_DEFAULT:
+            pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
+            g_value_set_uint(value, priv->width);
+            break;
+
+        case PROP_ROI_HEIGHT_DEFAULT:
+            pylon_camera_get_sensor_size(&priv->width, &priv->height, &error);
+            g_value_set_uint(value, priv->height);
+            break;
+
         case PROP_ROI_WIDTH_MULTIPLIER:
             g_value_set_uint(value, 1);
             break;
@@ -368,6 +380,49 @@ static void uca_pylon_camera_class_init(UcaPylonCameraClass *klass)
             "Name of the camera",
             "", G_PARAM_READABLE);
 
+    /*guint sensor_width = 0;
+    guint sensor_height = 0;
+    GError* error;
+    pylon_camera_get_sensor_size(&sensor_width, &sensor_height, &error);*/
+
+    pylon_properties[PROP_ROI_WIDTH_DEFAULT] =
+        g_param_spec_uint("roi-width-default",
+            "ROI width default value",
+            "ROI width default value",
+            0, G_MAXUINT, 0,
+            G_PARAM_READABLE);
+    pylon_properties[PROP_ROI_HEIGHT_DEFAULT] =
+        g_param_spec_uint("roi-height-default",
+            "ROI height default value",
+            "ROI height default value",
+            0, G_MAXUINT, 0,
+            G_PARAM_READABLE);
+    /*g_object_class_install_property(gobject_class, PROP_ROI_X, pylon_properties[PROP_ROI_X]);
+
+
+    pylon_properties[PROP_ROI_Y] =
+        g_param_spec_uint(uca_camera_props[PROP_ROI_Y],
+            "Vertical coordinate",
+            "Vertical coordinate",
+            0, G_MAXUINT, 0,
+            G_PARAM_READWRITE);
+    g_object_class_install_property(gobject_class, PROP_ROI_Y, pylon_properties[PROP_ROI_Y]);
+
+    pylon_properties[PROP_ROI_WIDTH] =
+        g_param_spec_uint(uca_camera_props[PROP_ROI_WIDTH],
+            "Width",
+            "Width of the region of interest",
+            1, G_MAXUINT, 500,
+            G_PARAM_READWRITE);
+    g_object_class_install_property(gobject_class, PROP_ROI_WIDTH, pylon_properties[PROP_ROI_WIDTH]);
+
+    pylon_properties[PROP_ROI_HEIGHT] =
+        g_param_spec_uint(uca_camera_props[PROP_ROI_HEIGHT],
+            "Height",
+            "Height of the region of interest",
+            1, G_MAXUINT, 100,
+            G_PARAM_READWRITE);
+    g_object_class_install_property(gobject_class, PROP_ROI_HEIGHT, pylon_properties[PROP_ROI_HEIGHT]); */
 
     for (guint id = N_BASE_PROPERTIES; id < N_PROPERTIES; id++)
         g_object_class_install_property(gobject_class, id, pylon_properties[id]);
-- 
cgit v1.2.3


From 310c98755e0c8fe1d95d4e4e43b7d08c70d06353 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 26 Jul 2012 15:36:02 +0200
Subject: adjusted pylon additions

---
 src/uca-camera.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/uca-camera.c b/src/uca-camera.c
index 602a3c4..78adae3 100644
--- a/src/uca-camera.c
+++ b/src/uca-camera.c
@@ -382,6 +382,11 @@ static UcaCamera *uca_camera_new_from_type(const gchar *type, GError **error)
         return UCA_CAMERA(uca_pco_camera_new(error));
 #endif
 
+#ifdef HAVE_PYLON_CAMERA
+    if (!g_strcmp0(type, "pylon"))
+        return UCA_CAMERA(uca_pylon_camera_new(error));
+#endif
+
 #ifdef HAVE_UFO_CAMERA
     if (!g_strcmp0(type, "ufo"))
         return UCA_CAMERA(uca_ufo_camera_new(error));
@@ -425,10 +430,6 @@ UcaCamera *uca_camera_new(const gchar *type, GError **error)
 
     camera = uca_camera_new_from_type(type, &tmp_error);
 
-#ifdef HAVE_PYLON_CAMERA
-    if (!g_strcmp0(type, "pylon"))
-        camera = UCA_CAMERA(uca_pylon_camera_new(&tmp_error));
-#endif
     if (tmp_error != NULL) {
         g_propagate_error(error, tmp_error);
         return NULL;
-- 
cgit v1.2.3


From 7c5a0bdefd27180da32aaaf9b1331c69c66e1693 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Fri, 27 Jul 2012 08:18:30 +0200
Subject: SCHNEIDE-276

---
 src/cameras/pylon_camera.cpp   | 28 ++++++++++++++++++++++++++++
 src/cameras/pylon_camera.h     |  3 +++
 src/cameras/uca-pylon-camera.c | 23 ++++++++++++++++++++---
 3 files changed, 51 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
index b73bc18..094e3c8 100644
--- a/src/cameras/pylon_camera.cpp
+++ b/src/cameras/pylon_camera.cpp
@@ -185,6 +185,34 @@ void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint
   }
 }
 
+void pylon_camera_get_gain(gint* gain, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    yat::Any gain_result;
+    pGrabber->get_gain(gain_result);
+    *gain = yat::any_cast<gint>(gain_result);
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
+void pylon_camera_set_gain(gint gain, GError** error)
+{
+  g_assert(pGrabber);
+  try
+  {
+    pGrabber->set_gain(yat::Any(gain));
+  }
+  catch (const yat::Exception& e)
+  {
+    yat_exception_to_gerror(e, error);
+  }
+}
+
 void pylon_camera_start_acquision(GError** error)
 {
   g_assert(pGrabber);
diff --git a/src/cameras/pylon_camera.h b/src/cameras/pylon_camera.h
index f5c7cdc..89b450b 100644
--- a/src/cameras/pylon_camera.h
+++ b/src/cameras/pylon_camera.h
@@ -17,6 +17,9 @@ void pylon_camera_get_bit_depth(guint* depth, GError** error);
 void pylon_camera_get_roi(guint16* roi_x, guint16* roi_y, guint16* roi_width, guint16* roi_height, GError** error);
 void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint16 roi_height, GError** error);
 
+void pylon_camera_get_gain(gint* gain, GError** error);
+void pylon_camera_set_gain(gint gain, GError** error);
+
 void pylon_camera_start_acquision(GError** error);
 void pylon_camera_stop_acquision(GError** error);
 void pylon_camera_grab(gpointer *data, GError** error);
diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 152ff01..23aa1a3 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -52,6 +52,7 @@ GQuark uca_pylon_camera_error_quark()
 enum {
     PROP_ROI_WIDTH_DEFAULT = N_BASE_PROPERTIES,
     PROP_ROI_HEIGHT_DEFAULT,
+    PROP_GAIN,
     N_PROPERTIES 
 };
 
@@ -195,9 +196,11 @@ static void uca_pylon_camera_set_property(GObject *object, guint property_id, co
             break;
 
         case PROP_EXPOSURE_TIME:
-            {
-              pylon_camera_set_exposure_time(g_value_get_double(value), &error);
-            }
+            pylon_camera_set_exposure_time(g_value_get_double(value), &error);
+            break;
+
+        case PROP_GAIN:
+            pylon_camera_set_gain(g_value_get_int(value), &error);
             break;
 
         default:
@@ -302,6 +305,14 @@ static void uca_pylon_camera_get_property(GObject *object, guint property_id, GV
             g_value_set_uint(value, priv->height);
             break;
 
+        case PROP_GAIN:
+            {
+              gint gain=0;
+              pylon_camera_get_gain(&gain, &error);
+              g_value_set_int(value, gain);
+            }
+            break;
+
         case PROP_ROI_WIDTH_MULTIPLIER:
             g_value_set_uint(value, 1);
             break;
@@ -397,6 +408,12 @@ static void uca_pylon_camera_class_init(UcaPylonCameraClass *klass)
             "ROI height default value",
             0, G_MAXUINT, 0,
             G_PARAM_READABLE);
+    pylon_properties[PROP_GAIN] =
+        g_param_spec_int("gain",
+            "gain",
+            "gain",
+            0, G_MAXINT, 0,
+            G_PARAM_READWRITE);
     /*g_object_class_install_property(gobject_class, PROP_ROI_X, pylon_properties[PROP_ROI_X]);
 
 
-- 
cgit v1.2.3


From 0b5720d0414f7e9f196664677899e999179a49f6 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Wed, 1 Aug 2012 14:06:50 +0200
Subject: extracted pylon_camera C-wrapper into own project; enhanced cmake
 build for pylon cameras

---
 src/CMakeLists.txt             |   9 +-
 src/cameras/pylon_camera.cpp   | 289 -----------------------------------------
 src/cameras/pylon_camera.h     |  32 -----
 src/cameras/uca-pylon-camera.c |   2 +-
 4 files changed, 5 insertions(+), 327 deletions(-)
 delete mode 100644 src/cameras/pylon_camera.cpp
 delete mode 100644 src/cameras/pylon_camera.h

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 931ca9b..13d677a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,7 +15,7 @@ set(cameras)
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 # --- Find camera interfaces
-#find_package(PCO)
+find_package(PCO)
 find_package(PF)
 find_package(IPE)
 find_package(Pylon)
@@ -96,13 +96,12 @@ if (PYLON_FOUND)
   option(HAVE_PYLON_CAMERA "Camera: Pylon based (Basler)" ON)
 
   if (HAVE_PYLON_CAMERA)
-        list(APPEND uca_SRCS cameras/uca-pylon-camera.c cameras/pylon_camera.cpp)
+        list(APPEND uca_SRCS cameras/uca-pylon-camera.c)
         list(APPEND uca_HDRS cameras/uca-pylon-camera.h)
         list(APPEND cameras "Pylon")
-        set(uca_LIBS ${uca_LIBS} ${PYLON_LIBS})
+        set(uca_LIBS ${uca_LIBS} ${PYLON_LIB})
 
-        include_directories(${PYLON_INCLUDE_DIRS})
-        link_directories(/opt/pylon/lib64)
+        include_directories(${PYLON_INCLUDE_DIR})
   endif()
 
 endif()
diff --git a/src/cameras/pylon_camera.cpp b/src/cameras/pylon_camera.cpp
deleted file mode 100644
index 094e3c8..0000000
--- a/src/cameras/pylon_camera.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-
-#include "pylon_camera.h"
-#include <yat/plugin/PlugInManager.h>
-#include <yat/threading/Condition.h>
-#include <baslerpylon/IGrabber.h>
-#include <iostream>
-
-namespace {
-
-  GrabAPI::IGrabber* pGrabber = 0;
-  yat::Mutex pImageMutex;
-  yat::Condition pImageCondition(pImageMutex);
-  guint imageCounter = 0;
-  guint currentImage = 0;
-  GrabAPI::Image* image = NULL;
-  guint bytesPerPixel = 0;
-
-  void handle_image(GrabAPI::Image* newImage)
-  {
-    yat::MutexLock lock(pImageMutex);
-    delete image;
-    image = newImage;
-    imageCounter++;
-    pImageCondition.signal();
-  }
-
-  void yat_exception_to_gerror(const yat::Exception& e, GError** error)
-  {
-    if (e.errors.size() == 2)
-    {
-      g_set_error(error, 0, 0, 
-          "%s : %s : %s\n%s : %s : %s",
-          e.errors[0].reason.c_str(),
-          e.errors[0].desc.c_str(),
-          e.errors[0].origin.c_str(),
-          e.errors[1].reason.c_str(),
-          e.errors[1].desc.c_str(),
-          e.errors[1].origin.c_str());
-      return;
-    }
-    if (e.errors.size() == 3)
-    {
-      g_set_error(error, 0, 0, 
-          "%s : %s : %s\n%s : %s : %s\n%s : %s : %s",
-          e.errors[0].reason.c_str(),
-          e.errors[0].desc.c_str(),
-          e.errors[0].origin.c_str(),
-          e.errors[1].reason.c_str(),
-          e.errors[1].desc.c_str(),
-          e.errors[1].origin.c_str(),
-          e.errors[2].reason.c_str(),
-          e.errors[2].desc.c_str(),
-          e.errors[2].origin.c_str());
-      return;
-    }
-
-    g_set_error(error, 0, 0, 
-        "%s : %s : %s",
-        e.errors[0].reason.c_str(),
-        e.errors[0].desc.c_str(),
-        e.errors[0].origin.c_str());
-  }
-
-}
-
-
-void pylon_camera_new(const char* lib_path, const char* camera_ip, GError** error)
-{
-  g_assert(!pGrabber);
-  try {
-
-    yat::PlugInManager pm;
-    std::pair<yat::IPlugInInfo*, yat::IPlugInFactory*> pp = 
-      pm.load((std::string(lib_path) + "/libbaslerpylon.so").c_str());
-
-    yat::IPlugInObject* plugin_obj = 0;
-    pp.second->create(plugin_obj);
-    pGrabber = static_cast<GrabAPI::IGrabber*>(plugin_obj);
-
-    yat::PlugInPropValues values;
-    values["CameraIP"] = yat::Any(std::string(camera_ip));
-    pGrabber->set_properties(values);
-    pGrabber->initialize();
-    pGrabber->set_image_handler(GrabAPI::ImageHandlerCallback::instanciate(handle_image));
-    pGrabber->open();
-  } 
-  catch (const yat::Exception& e) {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_set_exposure_time(gdouble exp_time, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    pGrabber->set_exposure_time(yat::Any(exp_time));
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_get_exposure_time(gdouble* exp_time, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    yat::Any exp_time_result;
-    pGrabber->get_exposure_time(exp_time_result);
-    *exp_time = yat::any_cast<gdouble>(exp_time_result);
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-
-void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    yat::Any w, h;
-    pGrabber->get_sensor_width(w);
-    pGrabber->get_sensor_height(h);
-    *width = yat::any_cast<yat_int32_t>(w);
-    *height = yat::any_cast<yat_int32_t>(h);
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_get_bit_depth(guint* depth, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    yat::Any bit_depth_result;
-    pGrabber->get_bit_depth(bit_depth_result);
-    *depth = yat::any_cast<yat_int32_t>(bit_depth_result);
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_get_roi(guint16* roi_x, guint16* roi_y, guint16* roi_width, guint16* roi_height, GError** error)
-{
-  g_assert(pGrabber);
-  g_assert(roi_x);
-  g_assert(roi_y);
-  g_assert(roi_width);
-  g_assert(roi_height);
-  try
-  {
-    GrabAPI::ROI roi = pGrabber->get_roi();
-    *roi_x = roi.x;
-    *roi_y = roi.y;
-    *roi_width = roi.width;
-    *roi_height = roi.height;
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint16 roi_height, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    GrabAPI::ROI roi(roi_x, roi_y, roi_width, roi_height);
-    pGrabber->set_roi(roi);
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_get_gain(gint* gain, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    yat::Any gain_result;
-    pGrabber->get_gain(gain_result);
-    *gain = yat::any_cast<gint>(gain_result);
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_set_gain(gint gain, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    pGrabber->set_gain(yat::Any(gain));
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_start_acquision(GError** error)
-{
-  g_assert(pGrabber);
-  guint bit_depth = 0;
-  pylon_camera_get_bit_depth(&bit_depth, error);
-  bytesPerPixel = 1;
-  if (bit_depth > 8) bytesPerPixel = 2;
-  if (bit_depth > 16) bytesPerPixel = 3;
-  if (bit_depth > 24) bytesPerPixel = 4;
-  try
-  {
-    {
-      yat::MutexLock lock(pImageMutex);
-      imageCounter = 0;
-      currentImage = 0;
-    }
-    pGrabber->start();
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_stop_acquision(GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-    pGrabber->stop();
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_grab(gpointer *data, GError** error)
-{
-  g_assert(pGrabber);
-  try
-  {
-      yat::MutexLock lock(pImageMutex);
-      g_assert(currentImage <= imageCounter);
-
-      while (currentImage == imageCounter)
-      {
-        std::cerr << "wait for next image... " << currentImage << std::endl;
-        pImageCondition.wait();
-      }
-
-      std::cerr << "grab next image " << currentImage << ", " << imageCounter 
-        << "; width: " << image->width() / bytesPerPixel << ", height: " << image->height() << std::endl;
-      g_assert(currentImage < imageCounter);
-      currentImage = imageCounter;
-      memcpy(*data, image->base(), image->width() * image->height());
-
-  }
-  catch (const yat::Exception& e)
-  {
-    yat_exception_to_gerror(e, error);
-  }
-}
-
-void pylon_camera_delete()
-{
-  if (!pGrabber)
-    return;
-
-  pGrabber->close();
-  pGrabber->uninitialize();
-  delete pGrabber;
-}
-
diff --git a/src/cameras/pylon_camera.h b/src/cameras/pylon_camera.h
deleted file mode 100644
index 89b450b..0000000
--- a/src/cameras/pylon_camera.h
+++ /dev/null
@@ -1,32 +0,0 @@
-
-#ifndef _PYLON_CAMERA_H_
-#define _PYLON_CAMERA_H_
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-void pylon_camera_new(const gchar* lib_path, const gchar* camera_ip, GError** error);
-
-void pylon_camera_set_exposure_time(gdouble exp_time, GError** error);
-void pylon_camera_get_exposure_time(gdouble* exp_time, GError** error);
-
-void pylon_camera_get_sensor_size(guint* width, guint* height, GError** error);
-void pylon_camera_get_bit_depth(guint* depth, GError** error);
-
-void pylon_camera_get_roi(guint16* roi_x, guint16* roi_y, guint16* roi_width, guint16* roi_height, GError** error);
-void pylon_camera_set_roi(guint16 roi_x, guint16 roi_y, guint16 roi_width, guint16 roi_height, GError** error);
-
-void pylon_camera_get_gain(gint* gain, GError** error);
-void pylon_camera_set_gain(gint gain, GError** error);
-
-void pylon_camera_start_acquision(GError** error);
-void pylon_camera_stop_acquision(GError** error);
-void pylon_camera_grab(gpointer *data, GError** error);
-
-void pylon_camera_delete();
-
-G_END_DECLS
-
-#endif
-
diff --git a/src/cameras/uca-pylon-camera.c b/src/cameras/uca-pylon-camera.c
index 23aa1a3..6fef112 100644
--- a/src/cameras/uca-pylon-camera.c
+++ b/src/cameras/uca-pylon-camera.c
@@ -18,9 +18,9 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <libpyloncam/pylon_camera.h>
 #include "uca-camera.h"
 #include "uca-pylon-camera.h"
-#include "pylon_camera.h"
 
 
 /*#define HANDLE_PYLON_ERROR(err)                       \
-- 
cgit v1.2.3


From 3e1c17378f21a737de85ad4c0e07210be9fcd5dd Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Wed, 1 Aug 2012 14:12:23 +0200
Subject: reduced differences to master

---
 src/CMakeLists.txt | 1 -
 1 file changed, 1 deletion(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 13d677a..c114cce 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,4 @@
 cmake_minimum_required(VERSION 2.8)
-set(CMAKE_VERBOSE_MAKEFILE TRUE)
 
 # --- Set sources -------------------------------------------------------------
 set(uca_SRCS
-- 
cgit v1.2.3


From 6683a6e9a6fc0259d5e5dfd97279680e292d7938 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Wed, 1 Aug 2012 14:58:46 +0200
Subject: fixed pylon build

---
 src/CMakeLists.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c114cce..9238106 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -98,9 +98,9 @@ if (PYLON_FOUND)
         list(APPEND uca_SRCS cameras/uca-pylon-camera.c)
         list(APPEND uca_HDRS cameras/uca-pylon-camera.h)
         list(APPEND cameras "Pylon")
-        set(uca_LIBS ${uca_LIBS} ${PYLON_LIB})
+        set(uca_LIBS ${uca_LIBS} ${LIBPYLONCAM_LIBRARIES})
 
-        include_directories(${PYLON_INCLUDE_DIR})
+        include_directories(${LIBPYLONCAM_INCLUDEDIR})
   endif()
 
 endif()
-- 
cgit v1.2.3


From 91daa3bdebd1fc1e368ff9fa2e99b4ea1131361e Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 2 Aug 2012 11:44:17 +0200
Subject: using LIBDIR

---
 src/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9238106..acba8a4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -101,6 +101,7 @@ if (PYLON_FOUND)
         set(uca_LIBS ${uca_LIBS} ${LIBPYLONCAM_LIBRARIES})
 
         include_directories(${LIBPYLONCAM_INCLUDEDIR})
+        link_directories(${LIBPYLONCAM_LIBDIR})
   endif()
 
 endif()
-- 
cgit v1.2.3


From d5881265ee7c3995508aaa84275be498e30c5c8b Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 2 Aug 2012 14:49:11 +0200
Subject: added variables with which building of test/control and reference
 documentation can be disabled

---
 src/CMakeLists.txt | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index acba8a4..3c80afd 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -162,8 +162,11 @@ target_link_libraries(uca
 
 
 # --- Build documentation -----------------------------------------------------
+if (NOT DEFINED WITH_REFERENCE)
+  set(WITH_REFERENCE TRUE)
+endif()
 pkg_check_modules(GTK_DOC gtk-doc)
-if(GTK_DOC_FOUND)
+if(GTK_DOC_FOUND AND WITH_REFERENCE)
     option(WITH_GTK_DOC "Build documentation" ON)
     if (WITH_GTK_DOC)
         set(docs_dir "${CMAKE_CURRENT_BINARY_DIR}")
@@ -245,7 +248,7 @@ if(GTK_DOC_FOUND)
 
         install(FILES ${reference_files} DESTINATION share/gtk-doc/html/uca)
     endif()
-endif(GTK_DOC_FOUND)
+endif(GTK_DOC_FOUND AND WITH_REFERENCE)
 
 
 # --- Install target ----------------------------------------------------------
-- 
cgit v1.2.3


From 081f4ab3e06cf343052b01132bb762485b2a2554 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Thu, 2 Aug 2012 16:14:44 +0200
Subject: added support for libuca.spec.in

---
 src/CMakeLists.txt | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3c80afd..eab7a54 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -282,7 +282,9 @@ set(CPACK_PACKAGE_NAME "libuca")
 
 # --- Distro specific
 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.6), libgcc1 (>= 1:4.1)")
-set(CPACK_SET_DESTDIR ON)
+
+# this doesn't work when building RPMs on Jenkins
+#set(CPACK_SET_DESTDIR ON)
 
 set(CPACK_PACKAGE_CONTACT "Matthias Vogelgesang")
 set(CPACK_PACKAGE_VENDOR "Karlsruhe Institute of Technology/IPE")
@@ -297,4 +299,7 @@ set(CPACK_SOURCE_IGNORE_FILES ".git" "tags" ".bzr" ".swp")
 set(CPACK_SOURCE_PACKAGE_FILE_NAME "libuca-${UCA_VERSION_STRING}" CACHE INTERNAL "tarball basename")
 set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${UCA_VERSION_STRING}-${CMAKE_SYSTEM_PROCESSOR}")
 
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../libuca.spec.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/../libuca.spec" @ONLY IMMEDIATE)
+
 include(CPack)
-- 
cgit v1.2.3


From 24587b5bfac1bc8bb16d16df692baed5c267ec25 Mon Sep 17 00:00:00 2001
From: Volker Kaiser <volker.kaiser@softwareschneiderei.de>
Date: Tue, 7 Aug 2012 12:20:24 +0200
Subject: enabled DESTDIR

---
 src/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index eab7a54..4e14787 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -284,7 +284,7 @@ set(CPACK_PACKAGE_NAME "libuca")
 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.6), libgcc1 (>= 1:4.1)")
 
 # this doesn't work when building RPMs on Jenkins
-#set(CPACK_SET_DESTDIR ON)
+set(CPACK_SET_DESTDIR ON)
 
 set(CPACK_PACKAGE_CONTACT "Matthias Vogelgesang")
 set(CPACK_PACKAGE_VENDOR "Karlsruhe Institute of Technology/IPE")
-- 
cgit v1.2.3