diff options
-rw-r--r-- | src/uca-cam.h | 40 | ||||
-rw-r--r-- | src/uca.h | 100 |
2 files changed, 119 insertions, 21 deletions
diff --git a/src/uca-cam.h b/src/uca-cam.h index 5535dd0..0e07c29 100644 --- a/src/uca-cam.h +++ b/src/uca-cam.h @@ -55,16 +55,54 @@ struct uca_camera_priv *uca_cam_new(void); * Represents a camera abstraction, that concrete cameras must implement. */ typedef struct uca_camera_priv { - /* virtual methods to be overridden by concrete cameras */ + /** + * \see ufo_destroy() + */ uint32_t (*destroy) (struct uca_camera_priv *cam); + + /** + * \see ufo_cam_set_property() + */ uint32_t (*set_property) (struct uca_camera_priv *cam, uca_property_ids property, void *data); + + /** + * \see ufo_cam_get_property() + */ uint32_t (*get_property) (struct uca_camera_priv *cam, uca_property_ids property, void *data, size_t num); + + /** + * \see ufo_cam_start_recording() + */ uint32_t (*start_recording) (struct uca_camera_priv *cam); + + /** + * \see ufo_cam_stop_recording() + */ uint32_t (*stop_recording) (struct uca_camera_priv *cam); + + /** + * \see ufo_cam_trigger() + */ uint32_t (*trigger) (struct uca_camera_priv *cam); + + /** + * \see ufo_cam_register_callback() + */ uint32_t (*register_callback) (struct uca_camera_priv *cam, uca_cam_grab_callback callback, void *user); + + /** + * \see ufo_cam_release_buffer() + */ uint32_t (*release_buffer) (struct uca_camera_priv *cam, void *buffer); + + /** + * \see ufo_cam_grab() + */ uint32_t (*grab) (struct uca_camera_priv *cam, char *buffer, void *meta_data); + + /** + * \see ufo_cam_readout() + */ uint32_t (*readout) (struct uca_camera_priv *cam); struct uca_grabber_priv *grabber; /**< grabber associated with this camera */ @@ -40,50 +40,100 @@ extern "C" { * \section intro_sec Introduction * * libuca is a thin wrapper to make different cameras and their access - * interfaces (via CameraLink, PCIe, Thunderbolt …) accessible in an easy way. + * interfaces (via CameraLink, PCIe …) accessible in an easy way. * It builds support for cameras, when it can find the necessary dependencies, * so there is no need to have camera SDKs installed when you don't own a * camera. * + * \section intro_installation Installation from source + * + * Check out the code from vogelgesang/libuca or untar the tarball. Make sure to + * install CMake and any third party drivers and SDKs that you want to have + * accessed by libuca. Now go into some empty build directory and issue + * + * \verbatim +$ cmake PATH_TO_LIBUCA_SOURCE +$ make +$ make install + \endverbatim + * * \section intro_quickstart Quick Start * - * First you would create a new uca_t structure + * First of all you have to create a new uca handle to initialize the individual + * subsystems * - * \code struct uca_t *uca = uca_init() \endcode + * \code uca *u = uca_init(); \endcode * - * and see if it is not NULL. If it is NULL, no camera or frame grabber was - * found. If you build with HAVE_DUMMY_CAMERA, there will always be at least the - * dummy camera available. + * and see if uca_init() did not return NULL. If this is the case, no camera or + * frame grabber was found. If you build with HAVE_DUMMY_CAMERA, there will + * always be at least the dummy camera available. * * You can then iterate through all available cameras using * * \code - * struct uca_camera_t *i = uca->cameras; + * uca_camera *i = uca->cameras; * while (i != NULL) { * // do something with i * i = i->next; * } * \endcode * - * With such a uca_camera_t structure, you can set properties, retrieve - * properties or start grabbing frames. Be aware, to check bit depth and frame - * dimensions in order to allocate enough memory. + * The uca_camera handle is used to set and retrieve properties: + * + * \code + * uca_camera *cam = uca->cameras; + * uint32_t val = 5000; + * uca_cam_set_property(cam, UCA_PROP_EXPOSURE, &val); + * + * uint32_t width, height; + * uca_cam_get_property(cam, UCA_PROP_WIDTH, &width, NULL); + * uca_cam_get_property(cam, UCA_PROP_HEIGHT, &height, NULL); + * \endcode + * + * \section properties Property system + * + * Each property has a unique id listed in the #uca_property_ids enum. + * Information about each property is given in a uca_property structure that is + * mapped with uca_get_full_property(). The description lists the unit, type and + * access rights. + * + * \section intro_recording Recording + * + * To record in synchronous fashion use uca_cam_grab() like + * + * \code + * void *buffer = (void *) malloc(width * height * bytes_per_pixel); + * uca_cam_start_recording(cam); + * uca_cam_grab(cam, (char *) buffer, NULL); + * uca_cam_stop_recording(cam); + * \endcode + * + * Eventually you will have to cleanup the system by calling + * + * \code uca_destroy(u); \endcode * * \section intro_usage Adding new cameras * - * Up to now, new cameras have to be integrated into libuca directly. Later on, - * we might provide a plugin mechanism. To add a new camera, add - * cameras/new-cam.c and cameras/new-cam.h to the source tree and change - * CMakeLists.txt to include these files. Furthermore, if this camera relies on - * external dependencies, these have to be found first via the CMake system. + * To add a new camera, add cameras/new-cam.c and cameras/new-cam.h to the + * source tree and change CMakeLists.txt to include these files. + * Furthermore, if this camera relies on external dependencies, these have + * to be found first via the CMake system. * * The new camera must export exactly one function: uca_new_camera_init() which * checks if (given the grabber) the camera is available and sets the function * pointers to access the camera accordingly. + * + * \section api_reference API reference + * + * All function definitions can be found in uca.h. + * */ /* The property IDs must start with 0 and must be continuous. Whenever this * library is released, the IDs must not change to guarantee binary compatibility! */ +/** + * ID of all supported properties + */ typedef enum { UCA_PROP_NAME = 0, UCA_PROP_WIDTH, @@ -247,9 +297,9 @@ typedef struct { */ const char *name; - uca_unit unit; - uca_types type; - uca_access_rights access; + uca_unit unit; /**< Physical unit of this property */ + uca_types type; /**< Type of this property */ + uca_access_rights access; /**< Access rights of this property */ } uca_property; @@ -354,8 +404,8 @@ typedef struct uca_grabber { * Keeps a list of cameras and grabbers. */ typedef struct { - uca_camera *cameras; - uca_grabber *grabbers; + uca_camera *cameras; /**< Root of detected camera list */ + uca_grabber *grabbers; /**< Root of detected grabber list */ } uca; /** @@ -380,16 +430,26 @@ void uca_destroy(uca *u); /** * Convert a property string to the corresponding ID + * + * \param[in] property_name Name of the property + * \param[out] prop_id Resulting property ID + * \return Error code */ uint32_t uca_get_property_id(const char *property_name, uca_property_ids *prop_id); /** * Convert a property ID to the corresponding string + * + * \param property_id ID of a property + * \return If property is found name of the property else NULL */ const char* uca_get_property_name(uca_property_ids property_id); /** * Return the full property structure for a given ID + * + * \param property_id ID of a property + * \return Property description or NULL if property is not found */ uca_property *uca_get_full_property(uca_property_ids property_id); |