Exemplo n.º 1
0
/*!
  \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;
}
Exemplo n.º 2
0
/*!
 \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);
}
Exemplo n.º 3
0
/*!
 \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);
}