static void arv_gc_feature_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { ArvGcFeatureNode *node = ARV_GC_FEATURE_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_TOOLTIP: node->priv->tooltip = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION: node->priv->description = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME: node->priv->description = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE: node->priv->is_available = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED: node->priv->is_implemented = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED: node->priv->is_locked = NULL; break; default: break; } } }
static void arv_gc_swiss_knife_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcSwissKnife *node = ARV_GC_SWISS_KNIFE (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_P_VARIABLE: node->variables = g_slist_prepend (node->variables, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA: node->formula_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: arv_warning_genicam ("[GcSwissKnife::post_new_child] Constant and Expression not yet implemented"); break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } }
static void _pre_remove_child (ArvDomNode *parent, ArvDomNode *child) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (parent); property_node->value_data_up_to_date = FALSE; }
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->minimum = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM: case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM: node->maximum = 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; } } }
static void arv_gc_struct_entry_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcStructEntryNode *node = ARV_GC_STRUCT_ENTRY_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_SIGN: /* TODO */ node->sign = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LSB: node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MSB: node->msb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_BIT: node->msb = property_node; node->lsb = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } }
static void arv_gc_boolean_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcBoolean *node = ARV_GC_BOOLEAN (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_ON_VALUE: node->on_value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE: node->off_value = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } }
static const char * _get_unit (ArvGcConverter *gc_converter, GError **error) { if (gc_converter->unit == NULL) return NULL; return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_converter->unit), error); }
static void arv_gc_property_node_finalize (GObject *object) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (object); parent_class->finalize (object); g_free (property_node->value_data); }
static void _update_variables (ArvGcSwissKnife *gc_swiss_knife, GError **error) { ArvGcNode *node; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_swiss_knife->formula_node != NULL) expression = arv_gc_property_node_get_string (gc_swiss_knife->formula_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_expression (gc_swiss_knife->formula, expression); for (iter = gc_swiss_knife->variables; iter != NULL; iter = iter->next) { ArvGcVariableNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_int64_variable (gc_swiss_knife->formula, arv_gc_variable_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_double_variable (gc_swiss_knife->formula, arv_gc_variable_node_get_name (variable_node), value); } } }
static void arv_gc_float_node_set_float_value (ArvGcFloat *gc_float, double value, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; if (gc_float_node->value == NULL) return; arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->value), value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); }
static void arv_gc_float_node_impose_max (ArvGcFloat *gc_float, double maximum, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; if (gc_float_node->maximum == NULL) return; arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), maximum, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); }
static double arv_gc_float_node_get_max (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; double value; if (gc_float_node->maximum == NULL) return G_MAXDOUBLE; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXDOUBLE; } return value; }
static const char * arv_gc_float_node_get_value_as_string (ArvGcFeatureNode *node, GError **error) { ArvGcFloatNode *float_node = ARV_GC_FLOAT_NODE (node); GError *local_error = NULL; const char *string; if (float_node->value == NULL) return NULL; string = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (float_node->value), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; }
static const char * arv_gc_float_node_get_unit (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; const char *string; if (gc_float_node->unit == NULL) return NULL; string = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_float_node->unit), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; }
static double arv_gc_float_node_get_inc (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; double value; if (gc_float_node->increment == NULL) return 1.0; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->increment), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 1.0; } return value; }
static void arv_gc_enumeration_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcEnumeration *node = ARV_GC_ENUMERATION (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; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } else if (ARV_IS_GC_ENUM_ENTRY (child)) node->entries = g_slist_prepend (node->entries, child); }
gint64 arv_gc_index_node_get_index (ArvGcIndexNode *index_node, gint64 default_offset, GError **error) { gint64 offset; gint64 node_value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_INDEX_NODE (index_node), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); if (index_node->offset == NULL) offset = default_offset; else { if (index_node->is_p_offset) { ArvGcNode *node; ArvGc *genicam; genicam = arv_gc_node_get_genicam (ARV_GC_NODE (index_node)); node = arv_gc_get_node (genicam, index_node->offset); offset = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } } else offset = g_ascii_strtoll (index_node->offset, NULL, 0); } node_value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (index_node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return offset * node_value; }
gboolean _get_cache_validity (ArvGcRegisterNode *gc_register_node) { GSList *iter; gint modification_count; gint feature_modification_count; gboolean is_cache_valid = gc_register_node->is_cache_valid; for (iter = gc_register_node->invalidators; iter != NULL; iter = iter->next) { ArvGcInvalidatorNode *invalidator = iter->data; ArvGcNode *node; modification_count = arv_gc_invalidator_node_get_modification_count (invalidator); node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (invalidator)); feature_modification_count = arv_gc_feature_node_get_modification_count (ARV_GC_FEATURE_NODE (node)); arv_gc_invalidator_node_set_modification_count (invalidator, feature_modification_count); if (modification_count != feature_modification_count) is_cache_valid = FALSE; } return is_cache_valid; }
static void arv_gc_converter_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcConverter *node = ARV_GC_CONVERTER (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_P_VARIABLE: node->variables = g_slist_prepend (node->variables, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO: node->formula_to_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM: node->formula_from_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: node->expressions = g_slist_prepend (node->expressions, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: node->constants = g_slist_prepend (node->constants, 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; } } }
static void _update_to_variables (ArvGcConverter *gc_converter, GError **error) { ArvGcNode *node; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_converter->formula_to_node != NULL) expression = arv_gc_property_node_get_string (gc_converter->formula_to_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_expression (gc_converter->formula_to, expression); for (iter = gc_converter->expressions; iter != NULL; iter = iter->next) { const char *expression; const char *name; expression = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_sub_expression (gc_converter->formula_to, name, expression); } for (iter = gc_converter->constants; iter != NULL; iter = iter->next) { const char *constant; const char *name; constant = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_constant (gc_converter->formula_to, name, constant); } for (iter = gc_converter->variables; iter != NULL; iter = iter->next) { ArvGcPropertyNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_int64_variable (gc_converter->formula_to, arv_gc_property_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_double_variable (gc_converter->formula_to, arv_gc_property_node_get_name (variable_node), value); } } if (gc_converter->value != NULL) { node = arv_gc_property_node_get_linked_node (gc_converter->value); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_evaluator_evaluate_as_double (gc_converter->formula_to, NULL), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { arv_gc_float_set_value (ARV_GC_FLOAT (node), arv_evaluator_evaluate_as_double (gc_converter->formula_to, NULL), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } else arv_warning_genicam ("[GcConverter::set_value] Invalid pValue node '%s'", gc_converter->value); } }
static const char * arv_gc_property_node_get_node_name (ArvDomNode *node) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (node); switch (property_node->type) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: return "Value"; case ARV_GC_PROPERTY_NODE_TYPE_ADDRESS: return "Address"; case ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION: return "Description"; case ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP: return "ToolTip"; case ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME: return "DisplayName"; case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM: return "Min"; case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM: return "Max"; case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT: return "Inc"; case ARV_GC_PROPERTY_NODE_TYPE_UNIT: return "Unit"; case ARV_GC_PROPERTY_NODE_TYPE_ON_VALUE: return "OnValue"; case ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE: return "OffValue"; case ARV_GC_PROPERTY_NODE_TYPE_LENGTH: return "Length"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA: return "Formula"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO: return "FormulaTo"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM: return "FormulaFrom"; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: return "Expression"; case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: return "Constant"; case ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE: return "AccessMode"; case ARV_GC_PROPERTY_NODE_TYPE_CACHABLE: return "Cachable"; case ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME: return "PollingTime"; case ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS: return "Endianess"; case ARV_GC_PROPERTY_NODE_TYPE_SIGN: return "Sign"; case ARV_GC_PROPERTY_NODE_TYPE_LSB: return "LSB"; case ARV_GC_PROPERTY_NODE_TYPE_MSB: return "MSB"; case ARV_GC_PROPERTY_NODE_TYPE_BIT: return "Bit"; case ARV_GC_PROPERTY_NODE_TYPE_COMMAND_VALUE: return "CommandValue"; case ARV_GC_PROPERTY_NODE_TYPE_CHUNK_ID: return "ChunkID"; case ARV_GC_PROPERTY_NODE_TYPE_P_FEATURE: return "pFeature"; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: return "pValue"; case ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS: return "pAddress"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED: return "pIsImplemented"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE: return "pIsAvailable"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED: return "pIsLocked"; case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM: return "pMin"; case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM: return "pMax"; case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT: return "pInc"; case ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH: return "pLength"; case ARV_GC_PROPERTY_NODE_TYPE_P_PORT: return "pPort"; case ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE: return "pVariable"; case ARV_GC_PROPERTY_NODE_TYPE_P_COMMAND_VALUE: return "pCommandValue"; default: return "Unknown"; } }
static void arv_gc_register_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcRegisterNode *node = ARV_GC_REGISTER_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_ADDRESS: case ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS: node->addresses = g_slist_prepend (node->addresses, child); break; case ARV_GC_PROPERTY_NODE_TYPE_P_INDEX: node->index = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LENGTH: case ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH: node->length = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_PORT: node->port = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE: /* TODO */ node->access_mode = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_CACHABLE: node->cachable = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME: /* TODO */ node->polling_time = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS: node->endianess = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_SIGN: /* TODO */ node->sign = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LSB: node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MSB: node->msb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_BIT: node->msb = property_node; node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_INVALIDATOR: node->invalidators = g_slist_prepend (node->invalidators, property_node); break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } else if (ARV_IS_GC_SWISS_KNIFE (child)) node->swiss_knives = g_slist_prepend (node->swiss_knives, child); else ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); }
static gboolean _update_from_variables (ArvGcConverter *gc_converter, ArvGcConverterNodeType node_type, GError **error) { ArvGcNode *node = NULL; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_converter->formula_from_node != NULL) expression = arv_gc_property_node_get_string (gc_converter->formula_from_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_expression (gc_converter->formula_from, expression); for (iter = gc_converter->expressions; iter != NULL; iter = iter->next) { const char *expression; const char *name; expression = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_sub_expression (gc_converter->formula_from, name, expression); } for (iter = gc_converter->constants; iter != NULL; iter = iter->next) { const char *constant; const char *name; constant = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_constant (gc_converter->formula_from, name, constant); } for (iter = gc_converter->variables; iter != NULL; iter = iter->next) { ArvGcPropertyNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_int64_variable (gc_converter->formula_from, arv_gc_property_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_double_variable (gc_converter->formula_from, arv_gc_property_node_get_name (variable_node), value); } } if (gc_converter->value != NULL) { node = arv_gc_property_node_get_linked_node (gc_converter->value); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: value = arv_gc_integer_get_min (ARV_GC_INTEGER (node), &local_error); break; case ARV_GC_CONVERTER_NODE_TYPE_MAX: value = arv_gc_integer_get_max (ARV_GC_INTEGER (node), &local_error); break; default: value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); break; } if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_int64_variable (gc_converter->formula_from, "TO", value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: value = arv_gc_float_get_min (ARV_GC_FLOAT (node), &local_error); break; case ARV_GC_CONVERTER_NODE_TYPE_MAX: value = arv_gc_float_get_max (ARV_GC_FLOAT (node), &local_error); break; default: value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); break; } if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_double_variable (gc_converter->formula_from, "TO", value); } else { arv_warning_genicam ("[GcConverter::set_value] Invalid pValue node '%s'", gc_converter->value); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_INVALID_PVALUE, "pValue node '%s' of '%s' is invalid", arv_gc_property_node_get_string (gc_converter->value, NULL), arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_converter))); return FALSE; } } else { g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PVALUE_NOT_DEFINED, "pValue node of '%s' converter is not defined", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_converter))); return FALSE; } return TRUE; }