summaryrefslogtreecommitdiffstats
path: root/src/uca.c
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-02-28 15:11:51 +0100
committerMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-02-28 15:11:51 +0100
commitb715cc76cfd8d972663bd2dd15c461f0e6ed5fc3 (patch)
tree4a0b4269bb557d2f9eca2b079da32e8320d0f91c /src/uca.c
parentf588f10b6fc6e452d42a66abc56028fe21cd56c2 (diff)
downloaduca-b715cc76cfd8d972663bd2dd15c461f0e6ed5fc3.tar.gz
uca-b715cc76cfd8d972663bd2dd15c461f0e6ed5fc3.tar.bz2
uca-b715cc76cfd8d972663bd2dd15c461f0e6ed5fc3.tar.xz
uca-b715cc76cfd8d972663bd2dd15c461f0e6ed5fc3.zip
Complete frame grabber abstraction
Diffstat (limited to 'src/uca.c')
-rw-r--r--src/uca.c107
1 files changed, 96 insertions, 11 deletions
diff --git a/src/uca.c b/src/uca.c
index 1d0a515..7733411 100644
--- a/src/uca.c
+++ b/src/uca.c
@@ -25,13 +25,47 @@
#include "cameras/photron.h"
#endif
+static struct uca_property_t property_map[UCA_PROP_LAST+1] = {
+ { "name", uca_na, uca_string },
+ { "width", uca_pixel, uca_uint32t },
+ { "width.min", uca_pixel, uca_uint32t },
+ { "width.max", uca_pixel, uca_uint32t },
+ { "height", uca_pixel, uca_uint32t },
+ { "height.min", uca_pixel, uca_uint32t },
+ { "height.max", uca_pixel, uca_uint32t },
+ { "offset.x", uca_pixel, uca_uint32t },
+ { "offset.y", uca_pixel, uca_uint32t },
+ { "bitdepth", uca_bits, uca_uint8t },
+ { "exposure", uca_us, uca_uint32t },
+ { "exposure.min", uca_ns, uca_uint32t },
+ { "exposure.max", uca_ms, uca_uint32t },
+ { "delay", uca_us, uca_uint32t },
+ { "delay.min", uca_ns, uca_uint32t },
+ { "delay.max", uca_ms, uca_uint32t },
+ { "framerate", uca_na, uca_uint32t },
+ { "triggermode", uca_na, uca_uint32t },
+ { "timestampmode", uca_na, uca_uint32t },
+ { "scan-mode", uca_na, uca_uint32t },
+ { "interlace.samplerate", uca_na, uca_uint32t },
+ { "interlace.threshold.pixel", uca_na, uca_uint32t },
+ { "interlace.threshold.row", uca_na, uca_uint32t },
+ { "correctionmode", uca_na, uca_uint32t },
+ { NULL, 0, 0 }
+};
struct uca_t *uca_init()
{
struct uca_t *uca = (struct uca_t *) malloc(sizeof(struct uca_t));
uca->cameras = NULL;
- uca_cam_init inits[] = {
+ uca_grabber_init grabber_inits[] = {
+#ifdef HAVE_ME4
+ uca_me4_init,
+#endif
+ NULL
+ };
+
+ uca_cam_init cam_inits[] = {
#ifdef HAVE_PCO_EDGE
uca_pco_init,
#endif
@@ -44,15 +78,33 @@ struct uca_t *uca_init()
#ifdef HAVE_PH
uca_photron_init,
#endif
- NULL };
+ NULL
+ };
int i = 0;
- struct uca_camera_t* current = NULL;
+ struct uca_camera_t *current = NULL;
+
+ /* Probe each frame grabber that is configured */
+ struct uca_grabber_t *grabber = NULL;
+ while (grabber_inits[i] != NULL) {
+ uca_grabber_init init = grabber_inits[i];
+ /* FIXME: we don't only want to take the first one */
+ if (init(&grabber) != UCA_ERR_INIT_NOT_FOUND)
+ break;
+ }
+
+ if (grabber == NULL) {
+ free(uca);
+ return NULL;
+ }
+ grabber->next = NULL;
- while (inits[i] != NULL) {
+ /* Probe each camera that is configured */
+ i = 0;
+ while (cam_inits[i] != NULL) {
struct uca_camera_t *cam = NULL;
- uca_cam_init init = inits[i];
- if (init(&cam) != UCA_ERR_INIT_NOT_FOUND) {
+ uca_cam_init init = cam_inits[i];
+ if (init(&cam, grabber) != UCA_ERR_INIT_NOT_FOUND) {
if (current == NULL)
uca->cameras = current = cam;
else {
@@ -74,14 +126,47 @@ struct uca_t *uca_init()
void uca_destroy(struct uca_t *uca)
{
if (uca != NULL) {
- struct uca_camera_t *current = uca->cameras, *tmp;
- while (current != NULL) {
- tmp = current;
- current->destroy(current);
- current = current->next;
+ struct uca_camera_t *cam = uca->cameras, *tmp;
+ while (cam != NULL) {
+ tmp = cam;
+ cam->destroy(cam);
+ cam = cam->next;
free(tmp);
}
+
+ struct uca_grabber_t *grabber = uca->grabbers, *tmpg;
+ while (grabber != NULL) {
+ tmpg = grabber;
+ grabber->destroy(grabber);
+ grabber = grabber->next;
+ free(grabber);
+ }
+
free(uca);
}
}
+enum uca_property_ids uca_get_property_id(const char *property_name)
+{
+ char *name;
+ int i = 0;
+ while (property_map[i].name != NULL) {
+ if (!strcmp(property_map[i].name, property_name))
+ return i;
+ i++;
+ }
+ return UCA_ERR_PROP_INVALID;
+}
+
+struct uca_property_t *uca_get_full_property(enum uca_property_ids property_id)
+{
+ if ((property_id >= 0) && (property_id < UCA_PROP_LAST))
+ return &property_map[property_id];
+ return NULL;
+}
+
+const char* uca_get_property_name(enum uca_property_ids property_id)
+{
+ if ((property_id >= 0) && (property_id < UCA_PROP_LAST))
+ return property_map[property_id].name;
+}