/*! \brief Creates a stripchart widget (i.e. accel wizard) \param parent is the container for stripchart widget */ G_MODULE_EXPORT void create_stripchart(GtkWidget *parent) { GtkWidget *chart = NULL; gchar ** sources = NULL; gchar * tmpbuf = NULL; guint i = 0; gconstpointer *object = NULL; gint min = 0; gint max = 0; gint precision = 0; gchar * name = NULL; DataSize size = MTX_U08; Rtv_Map *rtv_map; ENTER(); rtv_map = (Rtv_Map *)DATA_GET(global_data,"rtv_map"); tmpbuf = (gchar *)OBJ_GET(parent,"sources"); if (tmpbuf); sources = g_strsplit(tmpbuf,",",-1); chart = mtx_stripchart_new(); gtk_container_add(GTK_CONTAINER(parent), chart); //gtk_widget_realize(chart); for (i=0;i<g_strv_length(sources);i++) { if (!rtv_map) continue; object = (gconstpointer *)g_hash_table_lookup(rtv_map->rtv_hash,sources[i]); if (!object) continue; if ((gchar *)DATA_GET(object,"dlog_gui_name")) name = (gchar *)DATA_GET(object,"dlog_gui_name"); else name = g_strdup("undefined!\n"); if (DATA_GET(object,"real_lower")) min = (GINT)strtol((gchar *)DATA_GET(object,"real_lower"),NULL,10); else min = get_extreme_from_size(size,LOWER); if (DATA_GET(object,"real_upper")) max = (GINT)strtol((gchar *)DATA_GET(object,"real_upper"),NULL,10); else max = get_extreme_from_size(size,UPPER); if (DATA_GET(object,"precision")) precision = (GINT)DATA_GET(object,"precision"); else precision = 0; mtx_stripchart_add_trace(MTX_STRIPCHART(chart),(gfloat)min,(gfloat)max,precision,name,NULL); } create_rtv_multi_value_historical_watch(sources,FALSE,"update_stripchart_data",chart); g_strfreev(sources); gtk_widget_show_all(parent); EXIT(); return; }
/*! \brief convert_before_download() converts the value passed using the conversions bound to the widget \param widget (GtkWidget *) widget to extract the conversion info from \param value (gfloat *) the "real world" value from the tuning gui before translation to MS-units \returns the integere ms-units form after conversion */ G_MODULE_EXPORT gint convert_before_download(GtkWidget *widget, gfloat value) { static GStaticMutex mutex = G_STATIC_MUTEX_INIT; gint return_value = 0; gint tmpi = 0; gchar * conv_expr = NULL; void *evaluator = NULL; DataSize size = MTX_U08; float lower = 0.0; float upper = 0.0; gfloat *multiplier = NULL; gfloat *adder = NULL; guint i = 0; GHashTable *mhash = NULL; GHashTable *ahash = NULL; gchar *key_list = NULL; gchar *mult_list = NULL; gchar *add_list = NULL; gchar **keys = NULL; gchar **mults = NULL; gchar **adds = NULL; gint table_num = 0; gchar *tmpbuf = NULL; gchar * source_key = NULL; gchar * hash_key = NULL; gint *algorithm = NULL; GHashTable *sources_hash = NULL; sources_hash = DATA_GET(global_data,"sources_hash"); algorithm = DATA_GET(global_data,"algorithm"); g_static_mutex_lock(&mutex); if (!OBJ_GET(widget,"size")) printf(__FILE__"%s %s\n",_(": convert_before_download, FATAL ERROR, size undefined for widget %s "),glade_get_widget_name(widget)); size = (DataSize)OBJ_GET(widget,"size"); if (OBJ_GET(widget,"raw_lower")) lower = (gfloat)strtol(OBJ_GET(widget,"raw_lower"),NULL,10); else lower = (gfloat)get_extreme_from_size(size,LOWER); if (OBJ_GET(widget,"raw_upper")) upper = (gfloat)strtol(OBJ_GET(widget,"raw_upper"),NULL,10); else upper = (gfloat)get_extreme_from_size(size,UPPER); /* MULTI EXPRESSION ONLY! */ if (OBJ_GET(widget,"multi_expr_keys")) { if ((!OBJ_GET(widget,"mhash")) && (!OBJ_GET(widget,"ahash"))) { mhash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); ahash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); key_list = OBJ_GET(widget,"multi_expr_keys"); mult_list = OBJ_GET(widget,"fromecu_mults"); add_list = OBJ_GET(widget,"fromecu_addds"); keys = g_strsplit(key_list,",",-1); mults = g_strsplit(mult_list,",",-1); adds = g_strsplit(add_list,",",-1); for (i=0;i<MIN(g_strv_length(keys),g_strv_length(mults));i++) { multiplier = g_new0(gfloat, 1); *multiplier = (gfloat)g_strtod(mults[i],NULL); g_hash_table_insert(mhash,g_strdup(keys[i]),multiplier); adder = g_new0(gfloat, 1); *adder = (gfloat)g_strtod(adds[i],NULL); g_hash_table_insert(ahash,g_strdup(keys[i]),adder); } g_strfreev(keys); g_strfreev(mults); g_strfreev(adds); OBJ_SET_FULL(widget,"mhash",mhash,g_hash_table_destroy); OBJ_SET_FULL(widget,"ahash",ahash,g_hash_table_destroy); } mhash = OBJ_GET(widget,"mhash"); ahash = OBJ_GET(widget,"ahash"); source_key = OBJ_GET(widget,"source_key"); if (!source_key) printf(_("big problem, source key is undefined!!\n")); hash_key = (gchar *)g_hash_table_lookup(sources_hash,source_key); tmpbuf = (gchar *)OBJ_GET(widget,"table_num"); if (tmpbuf) table_num = (GINT)strtol(tmpbuf,NULL,10); if (table_num == -1) /* Not a table */ { if (!hash_key) { multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); } else { multiplier = g_hash_table_lookup(mhash,(gchar *)hash_key); adder = g_hash_table_lookup(ahash,(gchar *)hash_key); } } else /* This is a 3d table */ { switch (algorithm[table_num]) { case SPEED_DENSITY: if (!hash_key) { multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); } else { multiplier = g_hash_table_lookup(mhash,hash_key); adder = g_hash_table_lookup(ahash,hash_key); } break; case ALPHA_N: multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); break; case MAF: multiplier = g_hash_table_lookup(mhash,"AFM_VOLTS"); adder = g_hash_table_lookup(ahash,"AFM_VOLTS"); break; } } /* Reverse calc due to this being TO the ecu */ if ((multiplier) && (adder)) return_value = (GINT)((value - (*adder))/(*multiplier)); else if (multiplier) return_value = (GINT)(value/(*multiplier)); else return_value = (GINT)value; } else /* NON Multi Expression */ { conv_expr = (gchar *)OBJ_GET(widget,"toecu_conv_expr"); /* Expression is NOT multi expression but has more complex math*/ if (conv_expr) { evaluator = (void *)OBJ_GET(widget,"dl_evaluator"); if (!evaluator) { evaluator = evaluator_create(conv_expr); assert(evaluator); OBJ_SET_FULL(widget,"dl_evaluator",(gpointer)evaluator,evaluator_destroy); } return_value = (GINT)evaluator_evaluate_x(evaluator,value); } else { multiplier = (gfloat *)OBJ_GET(widget,"fromecu_mult"); adder = (gfloat *)OBJ_GET(widget,"fromecu_add"); /* Handle all cases of with or without multiplier/adder*/ if ((multiplier) && (adder)) return_value = (GINT)((value - (*adder))/(*multiplier)); else if (multiplier) return_value = (GINT)(value/(*multiplier)); else return_value = (GINT)value; } } dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_before_dl():\n\t widget %s raw %.2f, sent %i\n",glade_get_widget_name(widget),value,return_value)); if (return_value > upper) { dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_before_download()\n\t WARNING value clamped at %f (%f <- %f -> %f)!!\n",upper,lower,value,upper)); return_value = upper; } if (return_value < lower) { dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_before_download()\n\t WARNING value clamped at %f (%f <- %f -> %f)!!\n",lower,lower,value,upper)); return_value = lower; } tmpi = return_value; if (OBJ_GET(widget,"lookuptable")) return_value = (GINT)reverse_lookup_obj(G_OBJECT(widget),tmpi); g_static_mutex_unlock(&mutex); return (return_value); }
/*! \brief convert_after_upload() converts the ms-units data to the real world units for display on the GUI \param widget (GtkWidget *) to extract the conversion info from to perform the necessary math \returns the real world value for the GUI */ G_MODULE_EXPORT gfloat convert_after_upload(GtkWidget * widget) { static GStaticMutex mutex = G_STATIC_MUTEX_INIT; static gint (*get_ecu_data_f)(gpointer); static void (*send_to_ecu_f)(gpointer, gint, gboolean) = NULL; gfloat return_value = 0.0; gchar * conv_expr = NULL; void *evaluator = NULL; gint tmpi = 0; DataSize size = 0; gfloat lower = 0.0; gfloat upper = 0.0; gboolean fromecu_complex = FALSE; guint i = 0; gint table_num = -1; GHashTable *mhash = NULL; GHashTable *ahash = NULL; gchar *key_list = NULL; gchar *mult_list = NULL; gchar *add_list = NULL; gchar **keys = NULL; gchar **mults = NULL; gchar **adds = NULL; gchar * tmpbuf = NULL; gchar * source_key = NULL; gchar * hash_key = NULL; gfloat *multiplier = NULL; gfloat *adder = NULL; gint *algorithm = NULL; GHashTable *sources_hash = NULL; extern gconstpointer *global_data; if (!get_ecu_data_f) get_symbol("get_ecu_data",(void *)&get_ecu_data_f); if (!send_to_ecu_f) get_symbol("send_to_ecu",(void *)&send_to_ecu_f); g_return_val_if_fail(get_ecu_data_f,0.0); g_return_val_if_fail(send_to_ecu_f,0.0); g_static_mutex_lock(&mutex); size = (DataSize)OBJ_GET(widget,"size"); if (size == 0) { printf(_("BIG PROBLEM, size undefined! widget %s, default to U08 \n"),(gchar *)glade_get_widget_name(widget)); size = MTX_U08; } if (OBJ_GET(widget,"raw_lower")) lower = (gfloat)strtol(OBJ_GET(widget,"raw_lower"),NULL,10); else lower = (gfloat)get_extreme_from_size(size,LOWER); if (OBJ_GET(widget,"raw_upper")) upper = (gfloat)strtol(OBJ_GET(widget,"raw_upper"),NULL,10); else upper = (gfloat)get_extreme_from_size(size,UPPER); fromecu_complex = (GBOOLEAN)OBJ_GET(widget,"fromecu_complex"); if (fromecu_complex) { g_static_mutex_unlock(&mutex); /*printf("Complex upload conversion for widget at page %i, offset %i, name %s\n",(GINT)OBJ_GET(widget,"page"),(GINT)OBJ_GET(widget,"offset"),glade_get_widget_name(widget)); */ return handle_complex_expr_obj(G_OBJECT(widget),NULL,UPLOAD); } if (OBJ_GET(widget,"lookuptable")) tmpi = lookup_data_obj(G_OBJECT(widget),get_ecu_data_f(widget)); else tmpi = get_ecu_data_f(widget); if (tmpi < lower) { dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_after_upload()\n\t WARNING RAW value out of range for widget %s, clamped at %.1f (%.1f <- %i -> %.1f), updating ECU with valid value within limits!!\n",(gchar *)glade_get_widget_name(widget),lower,lower,tmpi,upper)); tmpi = lower; send_to_ecu_f(widget,tmpi,TRUE); } if (tmpi > upper) { dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_after_upload()\n\t WARNING RAW value out of range for widget %s, clamped at %.1f (%.1f <- %i -> %.1f), updating ECU with valid value within limits!!\n",(gchar *)glade_get_widget_name(widget),lower,lower,tmpi,upper)); tmpi = upper; send_to_ecu_f(widget,tmpi,TRUE); } /* MULTI EXPRESSION ONLY! */ if (OBJ_GET(widget,"multi_expr_keys")) { sources_hash = DATA_GET(global_data,"sources_hash"); if ((!OBJ_GET(widget,"mhash")) && (!OBJ_GET(widget,"ahash"))) { mhash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); ahash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); key_list = OBJ_GET(widget,"multi_expr_keys"); mult_list = OBJ_GET(widget,"fromecu_mults"); add_list = OBJ_GET(widget,"fromecu_adds"); if (!mult_list) printf("BUG, widget %s is multi_expression but doesn't have fromecu_mults defined!\n",glade_get_widget_name(widget)); if (!add_list) printf("BUG, widget %s is multi_expression but doesn't have fromecu_adds defined!\n",glade_get_widget_name(widget)); keys = g_strsplit(key_list,",",-1); mults = g_strsplit(mult_list,",",-1); adds = g_strsplit(add_list,",",-1); for (i=0;i<MIN(g_strv_length(keys),g_strv_length(mults));i++) { multiplier = g_new0(gfloat, 1); *multiplier = (gfloat)g_strtod(mults[i],NULL); g_hash_table_insert(mhash,g_strdup(keys[i]),multiplier); adder = g_new0(gfloat, 1); *adder = (gfloat)g_strtod(adds[i],NULL); g_hash_table_insert(ahash,g_strdup(keys[i]),adder); } g_strfreev(keys); g_strfreev(mults); g_strfreev(adds); OBJ_SET_FULL(widget,"mhash",mhash,g_hash_table_destroy); OBJ_SET_FULL(widget,"ahash",ahash,g_hash_table_destroy); } mhash = OBJ_GET(widget,"mhash"); ahash = OBJ_GET(widget,"ahash"); source_key = OBJ_GET(widget,"source_key"); if (!source_key) printf(_("big problem, source key is undefined!!\n")); hash_key = (gchar *)g_hash_table_lookup(sources_hash,source_key); tmpbuf = (gchar *)OBJ_GET(widget,"table_num"); if (tmpbuf) table_num = (GINT)strtol(tmpbuf,NULL,10); if (table_num == -1) { if (!hash_key) { multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); } else { multiplier = g_hash_table_lookup(mhash,(gchar *)hash_key); adder = g_hash_table_lookup(ahash,(gchar *)hash_key); } } else { algorithm = DATA_GET(global_data,"algorithm"); switch (algorithm[table_num]) { case SPEED_DENSITY: if (!hash_key) { multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); } else { multiplier = g_hash_table_lookup(mhash,hash_key); adder = g_hash_table_lookup(ahash,hash_key); } break; case ALPHA_N: multiplier = g_hash_table_lookup(mhash,"DEFAULT"); adder = g_hash_table_lookup(ahash,"DEFAULT"); break; case MAF: multiplier = g_hash_table_lookup(mhash,"AFM_VOLTS"); adder = g_hash_table_lookup(ahash,"AFM_VOLTS"); break; } } if ((multiplier) && (adder)) return_value = (((gfloat)tmpi * (*multiplier)) + (*adder)); else if (multiplier) return_value = (gfloat)tmpi * (*multiplier); else return_value = (gfloat)tmpi; } else { conv_expr = (gchar *)OBJ_GET(widget,"fromecu_conv_expr"); if (conv_expr) { evaluator = (void *)OBJ_GET(widget,"ul_evaluator"); if (!evaluator) { evaluator = evaluator_create(conv_expr); assert(evaluator); OBJ_SET_FULL(widget,"ul_evaluator",(gpointer)evaluator,evaluator_destroy); } return_value = evaluator_evaluate_x(evaluator,tmpi); } else { multiplier = OBJ_GET(widget,"fromecu_mult"); adder = OBJ_GET(widget,"fromecu_add"); if ((multiplier) && (adder)) return_value = (((gfloat)tmpi * (*multiplier)) + (*adder)); else if (multiplier) return_value = (gfloat)tmpi * (*multiplier); else return_value = (gfloat)tmpi; /*dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_after_ul():\n\tNo/Fast CONVERSION defined for widget %s, value %f\n",(gchar *)glade_get_widget_name(widget), return_value));*/ } } // dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_after_ul()\n\t page %i,offset %i, raw %i, val %f\n",page,offset,tmpi,return_value)); g_static_mutex_unlock(&mutex); return (return_value); }