summaryrefslogtreecommitdiffstats
path: root/docs/quickstart.rst
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2014-07-11 11:06:28 +0200
committerMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2014-07-11 11:06:28 +0200
commitf82414cc075c224cff42ebf5ade7c77a16ddb9cd (patch)
treedb87e9284be4d1ee8a39300c2647e30e609c3a53 /docs/quickstart.rst
parent97c66c2aee58370044b6444251266d7177caab9e (diff)
downloadlibuca-f82414cc075c224cff42ebf5ade7c77a16ddb9cd.tar.gz
libuca-f82414cc075c224cff42ebf5ade7c77a16ddb9cd.tar.bz2
libuca-f82414cc075c224cff42ebf5ade7c77a16ddb9cd.tar.xz
libuca-f82414cc075c224cff42ebf5ade7c77a16ddb9cd.zip
Split up the manual
Diffstat (limited to 'docs/quickstart.rst')
-rw-r--r--docs/quickstart.rst228
1 files changed, 228 insertions, 0 deletions
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
new file mode 100644
index 0000000..59cb01e
--- /dev/null
+++ b/docs/quickstart.rst
@@ -0,0 +1,228 @@
+Quickstart
+==========
+
+Installation
+------------
+
+Before installing ``libuca`` itself, you should install any drivers and
+SDKs needed to access the cameras you want to access through ``libuca``.
+Now you have two options: install pre-built packages or build from
+source.
+
+
+Installing packages
+~~~~~~~~~~~~~~~~~~~
+
+Packages for the core library and all plugins are currently provided for
+openSUSE. To install them run ``zypper``:
+
+::
+
+ sudo zypper in libuca-x.y.z-x86_64.rpm
+ sudo zypper in uca-plugin-*.rpm
+
+To install development files such as headers, you have to install the
+``libuca-x.y.z-devel.rpm`` package.
+
+
+Building from source
+~~~~~~~~~~~~~~~~~~~~
+
+Building the library and installing from source is simple and
+straightforward. Make sure you have
+
+- CMake,
+- a C compiler,
+- GLib and GObject development libraries and
+- necessary camera SDKs
+
+installed.
+
+For the base system, install ::
+
+ [Debian] sudo apt-get install libglib2.0 cmake gcc
+ [openSUSE] sudo zypper in glib2-devel cmake gcc
+
+In case you want to use the graphical user interface you also need the
+Gtk+ development libraries::
+
+ [Debian] sudo apt-get install libgtk+2.0-dev
+ [openSUSE] sudo zypper in gtk2-devel
+
+To generate bindings for third-party languages, you have to install ::
+
+ [Debian] sudo apt-get install gobject-introspection
+ [openSUSE] sudo zypper in gobject-introspection-devel
+
+
+Fetching the sources
+^^^^^^^^^^^^^^^^^^^^
+
+Untar the distribution ::
+
+ untar xfz libuca-x.y.z.tar.gz
+
+or clone the repository ::
+
+ git clone http://ufo.kit.edu/git/libuca
+
+and create a new, empty build directory inside::
+
+ cd libuca/
+ mkdir build
+
+
+Configuring and building
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+Now you need to create the Makefile with CMake. Go into the build
+directory and point CMake to the ``libuca`` top-level directory::
+
+ cd build/
+ cmake ..
+
+As long as the last line reads "Build files have been written to", the
+configuration stage is successful. In this case you can build ``libuca``
+with ::
+
+ make
+
+and install with ::
+
+ sudo make install
+
+If an *essential* dependency could not be found, the configuration stage
+will stop and build files will not be written. If a *non-essential*
+dependency (such as a certain camera SDK) is not found, the
+configuration stage will continue but that particular camera support not
+built.
+
+If you want to customize the build process you can pass several
+variables to CMake::
+
+ cmake .. -DPREFIX=/usr -DLIBDIR=/usr/lib64
+
+The former tells CMake to install into ``/usr`` instead of
+``/usr/local`` and the latter that we want to install the libraries and
+plugins into the ``lib64`` subdir instead of the default ``lib`` subdir
+as it is common on SUSE systems.
+
+
+Usage
+-----
+
+.. highlight:: c
+
+The API for accessing cameras is straightforward. First you need to
+include the necessary header files::
+
+ #include <glib-object.h>
+ #include <uca/uca-plugin-manager.h>
+ #include <uca/uca-camera.h>
+
+Then you need to setup the type system::
+
+ int
+ main (int argc, char *argv[])
+ {
+ UcaPluginManager *manager;
+ UcaCamera *camera;
+ GError *error = NULL; /* this _must_ be set to NULL */
+
+ g_type_init ();
+
+Now you can instantiate new camera *objects*. Each camera is identified
+by a human-readable string, in this case we want to access any pco
+camera that is supported by
+`libpco <http://ufo.kit.edu/repos/libpco.git/>`__. To instantiate a
+camera we have to create a plugin manager first::
+
+ manager = uca_plugin_manager_new ();
+ camera = uca_plugin_manager_get_camera (manager, "pco", &error);
+
+Errors are indicated with a returned value ``NULL`` and ``error`` set to
+a value other than ``NULL``::
+
+ if (camera == NULL) {
+ g_error ("Initialization: %s", error->message);
+ return 1;
+ }
+
+You should always remove the
+`reference <http://developer.gnome.org/gobject/stable/gobject-memory.html#gobject-memory-refcount>`__
+from the camera object when not using it in order to free all associated
+resources::
+
+ g_object_unref (camera);
+ return 0;
+ }
+
+Compile this program with ::
+
+ cc `pkg-config --cflags --libs libuca glib-2.0` foo.c -o foo
+
+Now, run ``foo`` and verify that no errors occur.
+
+
+Grabbing frames
+~~~~~~~~~~~~~~~
+
+To synchronously grab frames, first start the camera::
+
+ uca_camera_start_recording (camera, &error);
+ g_assert_no_error (error);
+
+Now, you have to allocate a suitably sized buffer and pass it to
+``uca_camera_grab``::
+
+ gpointer buffer = g_malloc0 (640 * 480 * 2);
+
+ uca_camera_grab (camera, buffer, &error);
+
+You have to make sure that the buffer is large enough by querying the
+size of the region of interest and the number of bits that are
+transferred.
+
+
+Getting and setting camera parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Because camera parameters vary tremendously between different vendors
+and products, they are realized with so-called GObject *properties*, a
+mechanism that maps string keys to typed and access restricted values.
+To get a value, you use the ``g_object_get`` function and provide memory
+where the result is stored::
+
+ guint roi_width;
+ gdouble exposure_time;
+
+ g_object_get (G_OBJECT(camera),
+ "roi-width", &roi_width,
+ "exposure-time", &exposure_time,
+ /* The NULL marks the end! */
+ NULL
+ );
+
+ g_print ("Width of the region of interest: %d\n", roi_width);
+ g_print ("Exposure time: %3.5s\n", exposure_time);
+
+In a similar way, properties are set with ``g_object_set``::
+
+ guint roi_width = 512;
+ gdouble exposure_time = 0.001;
+
+ g_object_set (G_OBJECT (camera),
+ "roi-width", roi_width,
+ "exposure-time", exposure_time,
+ NULL);
+
+Each property can be associated with a physical unit. To query for the
+unit call ``uca_camera_get_unit`` and pass a property name. The function
+will then return a value from the ``UcaUnit`` enum.
+
+Several essential camera parameters *must* be implemented by all
+cameras. To get a list of them consult the API reference for
+```UcaCamera`` <http://ufo.kit.edu/extra/libuca/reference/UcaCamera.html#UcaCamera.properties>`__.
+For camera specific parameters you need to consult the corresponding API
+reference for ``UfoFooCamera``. The latest nightly built reference can
+be found `here <http://ufo.kit.edu/extra/libuca/reference/>`__.