[aravis/dom] dom: make genicam float test pass.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis/dom] dom: make genicam float test pass.
- Date: Wed, 29 Feb 2012 10:19:09 +0000 (UTC)
commit f9a7f6638792652e816df20bb4c5c2d01e236b73
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Wed Feb 29 10:09:24 2012 +0100
dom: make genicam float test pass.
src/arvgcfloatnode.c | 152 ++++++++++++++++++++++-------------------------
src/arvgcfloatnode.h | 15 ++---
src/arvgcpropertynode.c | 29 +++++++++
src/arvgcpropertynode.h | 2 +
4 files changed, 110 insertions(+), 88 deletions(-)
---
diff --git a/src/arvgcfloatnode.c b/src/arvgcfloatnode.c
index 8c44b27..03904a2 100644
--- a/src/arvgcfloatnode.c
+++ b/src/arvgcfloatnode.c
@@ -1,6 +1,6 @@
/* Aravis - Digital camera library
*
- * Copyright  2009-2010 Emmanuel Pacaud
+ * Copyright  2009-2012 Emmanuel Pacaud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,43 +42,50 @@ arv_gc_float_node_get_node_name (ArvDomNode *node)
return "Float";
}
-/* ArvGcFeatureNode implementation */
+/* ArvDomElement implementation */
+
+static void
+arv_gc_float_node_post_new_child (ArvDomNode *self, ArvDomNode *child)
+{
+ ArvGcFloatNode *node = ARV_GC_FLOAT_NODE (self);
+
+ if (ARV_IS_GC_PROPERTY_NODE (child)) {
+ ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child);
+
+ switch (arv_gc_property_node_get_node_type (property_node)) {
+ case ARV_GC_PROPERTY_NODE_TYPE_VALUE:
+ case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE:
+ node->value = property_node;
+ break;
+ case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM:
+ case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM:
+ node->maximum = property_node;
+ break;
+ case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM:
+ case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM:
+ node->minimum = property_node;
+ break;
+ case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT:
+ case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT:
+ node->increment = property_node;
+ break;
+ case ARV_GC_PROPERTY_NODE_TYPE_UNIT:
+ node->unit = property_node;
+ break;
+ default:
+ ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child);
+ break;
+ }
+ }
+}
-#if 0
static void
-arv_gc_float_node_add_element (ArvGcFeatureNode *node, const char *name, const char *content, const char **attributes)
+arv_gc_float_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child)
{
- ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (node);
- double value;
- char *value_str = (char *) content;
-
- if (strcmp (name, "Value") == 0) {
- arv_str_parse_double (&value_str, &value);
- arv_force_g_value_to_double (&gc_float_node->value, value);
- } else if (strcmp (name, "Min") == 0) {
- arv_str_parse_double (&value_str, &value);
- arv_force_g_value_to_double (&gc_float_node->minimum, value);
- } else if (strcmp (name, "Max") == 0) {
- arv_str_parse_double (&value_str, &value);
- arv_force_g_value_to_double (&gc_float_node->maximum, value);
- } else if (strcmp (name, "Inc") == 0) {
- arv_force_g_value_to_int64 (&gc_float_node->increment,
- g_ascii_strtoll (content, NULL, 0));
- } else if (strcmp (name, "pValue") == 0) {
- arv_force_g_value_to_string (&gc_float_node->value, content);
- } else if (strcmp (name, "pMin") == 0) {
- arv_force_g_value_to_string (&gc_float_node->minimum, content);
- } else if (strcmp (name, "pMax") == 0) {
- arv_force_g_value_to_string (&gc_float_node->maximum, content);
- } else if (strcmp (name, "pInc") == 0) {
- arv_force_g_value_to_string (&gc_float_node->increment, content);
- } else if (strcmp (name, "Unit") == 0) {
- g_free (gc_float_node->unit);
- gc_float_node->unit = g_strdup (content);
- } else
- ARV_GC_FEATURE_NODE_CLASS (parent_class)->add_element (node, name, content, attributes);
+ g_assert_not_reached ();
}
-#endif
+
+/* ArvGcFeatureNode implementation */
static GType
arv_gc_float_node_get_value_type (ArvGcFeatureNode *node)
@@ -98,10 +105,10 @@ arv_gc_float_node_get_value_as_string (ArvGcFeatureNode *node)
{
ArvGcFloatNode *float_node = ARV_GC_FLOAT_NODE (node);
- g_ascii_formatd (float_node->v_string, G_ASCII_DTOSTR_BUF_SIZE,
- "%g", arv_gc_float_get_value (ARV_GC_FLOAT (node)));
+ if (float_node->value != NULL)
+ return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (float_node->value));
- return float_node->v_string;
+ return NULL;
}
/* ArvGcFloatNode implementation */
@@ -119,31 +126,11 @@ arv_gc_float_node_new (void)
static void
arv_gc_float_node_init (ArvGcFloatNode *gc_float_node)
{
- g_value_init (&gc_float_node->value, G_TYPE_DOUBLE);
- g_value_init (&gc_float_node->minimum, G_TYPE_DOUBLE);
- g_value_init (&gc_float_node->maximum, G_TYPE_DOUBLE);
- g_value_init (&gc_float_node->increment, G_TYPE_INT64);
-
- g_value_set_double (&gc_float_node->value, 0);
- g_value_set_double (&gc_float_node->minimum, -G_MINDOUBLE);
- g_value_set_double (&gc_float_node->maximum, G_MAXDOUBLE);
- g_value_set_int64 (&gc_float_node->increment, 1);
-
- gc_float_node->unit = NULL;
}
static void
arv_gc_float_node_finalize (GObject *object)
{
- ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (object);
-
- g_free (gc_float_node->unit);
-
- g_value_unset (&gc_float_node->value);
- g_value_unset (&gc_float_node->minimum);
- g_value_unset (&gc_float_node->maximum);
- g_value_unset (&gc_float_node->increment);
-
parent_class->finalize (object);
}
@@ -158,7 +145,8 @@ arv_gc_float_node_class_init (ArvGcFloatNodeClass *this_class)
object_class->finalize = arv_gc_float_node_finalize;
dom_node_class->get_node_name = arv_gc_float_node_get_node_name;
-/* gc_feature_node_class->add_element = arv_gc_float_node_add_element;*/
+ dom_node_class->post_new_child = arv_gc_float_node_post_new_child;
+ dom_node_class->pre_remove_child = arv_gc_float_node_pre_remove_child;
gc_feature_node_class->get_value_type = arv_gc_float_node_get_value_type;
gc_feature_node_class->set_value_from_string = arv_gc_float_node_set_value_from_string;
gc_feature_node_class->get_value_as_string = arv_gc_float_node_get_value_as_string;
@@ -170,50 +158,53 @@ static double
arv_gc_float_node_get_float_value (ArvGcFloat *gc_float)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- return arv_gc_get_double_from_value (genicam, &gc_float_node->value);
+ if (gc_float_node->value != NULL)
+ return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->value));
+
+ return 0.0;
}
static void
arv_gc_float_node_set_float_value (ArvGcFloat *gc_float, double value)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- arv_gc_set_double_to_value (genicam, &gc_float_node->value, value);
+ if (gc_float_node->value != NULL)
+ arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->value), value);
}
static double
arv_gc_float_node_get_min (ArvGcFloat *gc_float)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- return arv_gc_get_double_from_value (genicam, &gc_float_node->minimum);
+ if (gc_float_node->minimum != NULL)
+ return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum));
+
+ return -G_MAXFLOAT;
}
static double
arv_gc_float_node_get_max (ArvGcFloat *gc_float)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- return arv_gc_get_double_from_value (genicam, &gc_float_node->maximum);
+ if (gc_float_node->maximum != NULL)
+ return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum));
+
+ return G_MAXFLOAT;
}
static gint64
arv_gc_float_node_get_inc (ArvGcFloat *gc_float)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- return arv_gc_get_int64_from_value (genicam, &gc_float_node->increment);
+ if (gc_float_node->increment != NULL)
+ return arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_float_node->increment));
+
+ return 1;
}
static const char *
@@ -221,27 +212,28 @@ arv_gc_float_node_get_unit (ArvGcFloat *gc_float)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- return gc_float_node->unit;
+ if (gc_float_node->unit != NULL)
+ return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_float_node->unit));
+
+ return NULL;
}
static void
arv_gc_float_node_impose_min (ArvGcFloat *gc_float, double minimum)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- arv_gc_set_double_to_value (genicam, &gc_float_node->minimum, minimum);
+ if (gc_float_node->minimum != NULL)
+ arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum), minimum);
}
static void
arv_gc_float_node_impose_max (ArvGcFloat *gc_float, double maximum)
{
ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
- ArvGc *genicam;
- genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
- arv_gc_set_double_to_value (genicam, &gc_float_node->minimum, maximum);
+ if (gc_float_node->maximum != NULL)
+ arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), maximum);
}
static void
diff --git a/src/arvgcfloatnode.h b/src/arvgcfloatnode.h
index ff8bab1..5ac9172 100644
--- a/src/arvgcfloatnode.h
+++ b/src/arvgcfloatnode.h
@@ -1,6 +1,6 @@
/* Aravis - Digital camera library
*
- * Copyright  2009-2010 Emmanuel Pacaud
+ * Copyright  2009-2012 Emmanuel Pacaud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
#include <arvtypes.h>
#include <arvgcfeaturenode.h>
+#include <arvgcpropertynode.h>
G_BEGIN_DECLS
@@ -40,13 +41,11 @@ typedef struct _ArvGcFloatNodeClass ArvGcFloatNodeClass;
struct _ArvGcFloatNode {
ArvGcFeatureNode node;
- GValue value;
- GValue minimum;
- GValue maximum;
- GValue increment;
- char *unit;
-
- char v_string[G_ASCII_DTOSTR_BUF_SIZE];
+ ArvGcPropertyNode *value;
+ ArvGcPropertyNode *minimum;
+ ArvGcPropertyNode *maximum;
+ ArvGcPropertyNode *increment;
+ ArvGcPropertyNode *unit;
};
struct _ArvGcFloatNodeClass {
diff --git a/src/arvgcpropertynode.c b/src/arvgcpropertynode.c
index 65a290c..94aeca1 100644
--- a/src/arvgcpropertynode.c
+++ b/src/arvgcpropertynode.c
@@ -147,6 +147,35 @@ arv_gc_property_node_set_int64 (ArvGcPropertyNode *node, gint64 v_int64)
}
}
+double
+arv_gc_property_node_get_double (ArvGcPropertyNode *node)
+{
+ const char *string;
+
+ string = arv_gc_property_node_get_string (node);
+
+ if (string != NULL)
+ return g_ascii_strtod (string, NULL);
+
+ return 0.0;
+}
+
+void
+arv_gc_property_node_set_double (ArvGcPropertyNode *node, double v_double)
+{
+ ArvDomNode *child;
+
+ g_return_if_fail (ARV_IS_GC_PROPERTY_NODE (node));
+
+ child = arv_dom_node_get_first_child (ARV_DOM_NODE (node));
+ if (child != NULL) {
+ char buffer[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_ascii_dtostr (buffer, G_ASCII_DTOSTR_BUF_SIZE, v_double);
+ arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (child), buffer);
+ }
+}
+
ArvGcPropertyNodeType
arv_gc_property_node_get_node_type (ArvGcPropertyNode *node)
{
diff --git a/src/arvgcpropertynode.h b/src/arvgcpropertynode.h
index b6ce4f0..61c1e6b 100644
--- a/src/arvgcpropertynode.h
+++ b/src/arvgcpropertynode.h
@@ -86,6 +86,8 @@ const char * arv_gc_property_node_get_string (ArvGcPropertyNode *node);
void arv_gc_property_node_set_string (ArvGcPropertyNode *node, const char *string);
gint64 arv_gc_property_node_get_int64 (ArvGcPropertyNode *node);
void arv_gc_property_node_set_int64 (ArvGcPropertyNode *node, gint64 v_int64);
+double arv_gc_property_node_get_double (ArvGcPropertyNode *node);
+void arv_gc_property_node_set_double (ArvGcPropertyNode *node, double v_double);
ArvGcPropertyNodeType arv_gc_property_node_get_node_type (ArvGcPropertyNode *node);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]