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); } } }
int main (int argc, char **argv) { ArvEvaluator *evaluator; GOptionContext *context; GError *error = NULL; int i; double value; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); evaluator = arv_evaluator_new (NULL); arv_evaluator_set_double_variable (evaluator, "TDBL", 124.2); arv_evaluator_set_int64_variable (evaluator, "TINT", 3200); if (arv_option_expressions == NULL) { g_print ("Missing expression.\n"); return EXIT_FAILURE; } for (i = 0; arv_option_expressions[i] != NULL; i++) { arv_evaluator_set_expression (evaluator, arv_option_expressions[i]); value = arv_evaluator_evaluate_as_double (evaluator, &error); if (error != NULL) { g_print ("Error in '%s': %s\n", arv_option_expressions[i], error->message); g_error_free (error); error = NULL; } else g_print ("%s = %g\n", arv_option_expressions[i], value); } g_object_unref (evaluator); return EXIT_SUCCESS; }
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 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; }