sensors.c

来自「系统任务管理器」· C语言 代码 · 共 2,517 行 · 第 1/5 页

C
2,517
字号
					sensor->iodev, sensor->inter, &sensor->raw_value);		sensor->value = sensor->raw_value * sensor->factor + sensor->offset;		if (units_fahrenheit)			sensor->value = 1.8 * sensor->value + 32.0;		t = sensor->value;		}	if (! found_temp && _GK.demo)		{		t = 90.0 + (gfloat)(random() & 0xf);		found_temp = TRUE;		}	if (temp)		*temp = t;	if (units)		*units = units_fahrenheit ? 'F':'C';	if ((_GK.debug_level & DEBUG_SENSORS) && sensor)		printf("sensor_temp: %s %s t=%.2f\n",					sensor->name_locale, sensor->path, sensor->value);	if (found_temp && sensor)		gkrellm_check_alert(sensor->alert, sensor->value);	return found_temp;	}gbooleangkrellm_sensor_read_temperature(gpointer sr, gfloat *temp, gchar *units)	{	return sensor_read_temperature((Sensor *) sr, temp, units);	}static gbooleansensor_read_fan(Sensor *sensor, gfloat *fan)	{	gfloat	f = 0;	gint	found_fan = FALSE;	if (sensor && get_fan)		{		found_fan = thread_data_valid ? TRUE				: (*get_fan)(sensor->path, sensor->id,						sensor->iodev, sensor->inter, &sensor->raw_value);		sensor->value = sensor->raw_value * sensor->factor;		f = sensor->value;		}	if (! found_fan && _GK.demo)		{		f = 4980 + (gfloat)(random() & 0x3f);		found_fan = TRUE;		}	if (fan)		*fan = f;	if ((_GK.debug_level & DEBUG_SENSORS) && sensor)		printf("sensor_fan: %s %s rpm=%.0f\n",					sensor->name_locale, sensor->path, sensor->value);	if (found_fan && sensor)		gkrellm_check_alert(sensor->alert, sensor->value);	return found_fan;	}gbooleangkrellm_sensor_read_fan(gpointer sr, gfloat *fan)	{	return sensor_read_fan((Sensor *) sr, fan);	}static gbooleansensor_read_voltage(Sensor *sensor, gfloat *voltage)	{	gfloat		v = 0;	gfloat		offset;	gboolean	found_voltage = FALSE;	if (sensor && get_voltage)		{		found_voltage = thread_data_valid ? TRUE			: (*get_voltage)(sensor->path, sensor->id,					sensor->iodev, sensor->inter, &sensor->raw_value);		offset = sensor->offset;		if (sensor->vref)	/* A negative voltage is level shifted by vref */			offset *= sensor->vref->value;		sensor->value = sensor->raw_value * sensor->factor + offset;		v = sensor->value;		}	if (! found_voltage && _GK.demo)		{		v = 2.9 + (gfloat)(random() & 0x7) * 0.1;		found_voltage = TRUE;		}	if (voltage)		*voltage = v;	if ((_GK.debug_level & DEBUG_SENSORS) && sensor)		printf("sensor_voltage: %s %s v=%.2f\n",				sensor->name_locale, sensor->path, sensor->value);	if (found_voltage && sensor)		gkrellm_check_alert(sensor->alert, sensor->value);	return found_voltage;	}gbooleangkrellm_sensor_read_voltage(gpointer sr, gfloat *voltage)	{	return sensor_read_voltage((Sensor *) sr, voltage);	}/* =================================================================== *//* The sensors monitor */static void		sensor_reset_optionmenu(Sensor *sensor);#define	SENSOR_STYLE_NAME	"sensors"/* Temperature and fan sensors can be located on different panels depending|  on the sensor group.*/#define	SENSOR_PANEL_LOCATION	0#define	PROC_PANEL_LOCATION		1	/* SENSOR_GROUP_MAINBOARD */#define	CPU_PANEL_LOCATION		2	/* cpu0 if smp */#define	DISK_PANEL_LOCATION		1	/* SENSOR_GROUP_DISK	*/#define DO_TEMP	1#define	DO_FAN	1#define	DO_VOLT	1typedef struct	{	GkrellmPanel	**panel;	GkrellmDecal	*name_decal,					*sensor_decal;	Sensor			*sensor;	}	SensorMon;static GtkWidget				*temp_vbox,				*fan_vbox,				*volt_vbox;static GList	*volt_list,				*temperature_list,				*fan_list,				*disk_temperature_list;static GkrellmPanel				*pVolt,				*pTemp,				*pFan;static gint		style_id;static gint		volt_mon_width,				volt_mon_height,				volt_name_width,				volt_bezel_width;  /* Display modes */#define	DIGITAL_WITH_LABELS	0#define	DIGITAL_NO_LABELS	1#define	N_DISPLAY_MODES		2#define	MONITOR_PAD		6#define	NAME_PAD		4GkrellmMonitor	*mon_sensors;GkrellmMonitor	*mon_config_sensors;static GkrellmPiximage				*bezel_piximage;static GkrellmStyle				*bezel_style;		/* Just for the bezel image border */static gint		display_mode,				have_negative_volts;static gint		minus_width;		/* If will be drawing neg voltages */  /* If drawing '-' sign, grub a pixel or two to tighten the layout */static gint		pixel_grub;static gint		sensor_config_version;  /* Avoid writing decimal values into the config to avoid possible  |  locale changing decimal point breakage (decimal point can be '.' or ',')  */#define	SENSOR_FLOAT_FACTOR		10000.0static gfloat		sensor_float_factor = 1.0,					gkrellm_float_factor = 1.0;voidgkrellm_sensor_reset_location(gpointer sr)	{	GList	*list;	Sensor	*sensor;	for (list = sensor_list; list; list = list->next)		{		sensor = (Sensor *) list->data;		if (sr == sensor)			{			sensor->location = SENSOR_PANEL_LOCATION;			sensor_reset_optionmenu(sensor);			break;			}		}	}static voidsensor_relocation_error(gchar *pname)	{	gchar	*msg;	msg = g_strdup_printf(				_("Can't find a %s panel to relocate sensor to."),				pname ? pname : "?");	gkrellm_config_message_dialog(NULL, msg);	g_free(msg);	}  /* When moving off some other panel, reset that panel.  */static voidsensor_reset_location(Sensor *sr)	{	if (sr->group == SENSOR_GROUP_MAINBOARD)		{		if (sr->location == PROC_PANEL_LOCATION)			gkrellm_proc_set_sensor(NULL, sr->type);		else if (sr->location >= CPU_PANEL_LOCATION)			gkrellm_cpu_set_sensor(NULL, sr->type,						sr->location - CPU_PANEL_LOCATION);		}	else if (sr->group == SENSOR_GROUP_DISK)		{		if (sr->location == DISK_PANEL_LOCATION)			gkrellm_disk_temperature_remove(sr->id_name);		}	}voidgkrellm_sensors_interface_remove(gint interface)	{	GList		*list;	Sensor		*sensor;	gboolean	removed_one;	do		{		removed_one = FALSE;		for (list = sensor_list; list; list = list->next)			{			sensor = (Sensor *) list->data;			if (sensor->inter == interface)				{				sensor_reset_location(sensor);				g_free(sensor->id_name);				g_free(sensor->path);				g_free(sensor->name);				g_free(sensor->default_label);				g_free(sensor->vref_name);				sensor_list = g_list_remove(sensor_list, sensor);				g_free(sensor);				removed_one = TRUE;				break;				}			}		}	while (removed_one);			}static voidadd_sensor_monitor(Sensor *sr, GkrellmPanel **p, GList **smon_list)	{	SensorMon		*smon;	gfloat			t;	gchar			units;	gboolean		set_loc = FALSE;	sr->smon = NULL;	if (!sr->enabled)		return;	if (sr->location != SENSOR_PANEL_LOCATION)		{		if (sr->group == SENSOR_GROUP_MAINBOARD)			{			if (sr->location == PROC_PANEL_LOCATION)				set_loc = gkrellm_proc_set_sensor(sr, sr->type);			else				set_loc = gkrellm_cpu_set_sensor(sr, sr->type,							sr->location - CPU_PANEL_LOCATION);			}		else if (sr->group == SENSOR_GROUP_DISK)			{			if (sr->location == DISK_PANEL_LOCATION)				{				gkrellm_freeze_alert(sr->alert);				sensor_read_temperature(sr, &t, &units);				gkrellm_thaw_alert(sr->alert);				set_loc = gkrellm_disk_temperature_display((gpointer) sr,							sr->id_name, t, units);				if (set_loc)					disk_temperature_list =							g_list_append(disk_temperature_list, sr);				}			}		if (set_loc)			return;		sr->location = SENSOR_PANEL_LOCATION;		}	smon = g_new0(SensorMon, 1);	smon->sensor = sr;	smon->panel = p;		/* Alerts need a GkrellmPanel ** */	*smon_list = g_list_append(*smon_list, smon);	sr->smon = (gpointer) smon;	}static voidmake_sensor_monitor_lists(gboolean do_temp, gboolean do_fan, gboolean do_volt)	{	GList	*list;	Sensor	*sr;	if (do_temp)		{		gkrellm_free_glist_and_data(&temperature_list);		g_list_free(disk_temperature_list);		disk_temperature_list = NULL;		}	if (do_fan)		gkrellm_free_glist_and_data(&fan_list);	if (do_volt)		gkrellm_free_glist_and_data(&volt_list);	for (list = sensor_list; list; list = list->next)		{		sr = (Sensor *) list->data;		if (do_temp && sr->type == SENSOR_TEMPERATURE)			add_sensor_monitor(sr, &pTemp, &temperature_list);		if (do_fan && sr->type == SENSOR_FAN)			add_sensor_monitor(sr, &pFan, &fan_list);		if (do_volt && sr->type == SENSOR_VOLTAGE)			{			if (!sr->has_config && sr->vref_name)				sr->vref = lookup_vref(sr, sr->vref_name);			add_sensor_monitor(sr, &pVolt, &volt_list);			}		}	}#include "pixmaps/sensors/bg_volt.xpm"static voidcb_alert_trigger(GkrellmAlert *alert, SensorMon *smon)	{	GkrellmAlertdecal	*ad;	GkrellmDecal		*d;	ad = &alert->ad;	alert->panel = *smon->panel;	/* Make the GkrellmAlertdecal show up under the sensor decal	*/	d = smon->sensor_decal;	if (d)		{		ad->x = d->x - 2;		ad->y = d->y - 2;		ad->w = d->w + 3;		ad->h = d->h + 4;		gkrellm_render_default_alert_decal(alert);		}	}static voiddraw_bezels(GkrellmPanel *p, GList *smon_list, gint w, gint h, gint x_adjust)	{	GList			*list;	GkrellmBorder	*b		= &bezel_style->border;	SensorMon		*smon;	GkrellmDecal	*dv;	gint			x;	if (!bezel_piximage)		return;	for (list = smon_list; list; list = list->next)		{		smon = (SensorMon *) list->data;		dv = smon->sensor_decal;		x = dv->x + x_adjust;		if (w == 0)			w = b->left + dv->w + b->right - x_adjust;		if (h == 0)			h = b->top + b->bottom + dv->h;		gkrellm_paste_piximage(bezel_piximage, p->bg_pixmap,				x - b->left, dv->y - b->top, w, h);		gkrellm_paste_piximage(bezel_piximage, p->pixmap,				x - b->left, dv->y - b->top, w, h);		}	gdk_draw_drawable(p->bg_text_layer_pixmap, _GK.draw1_GC, p->bg_pixmap,				0, 0,  0, 0,  p->w, p->h);	}static gbooleanany_negative_volts(void)	{	GList		*list;	Sensor		*s;	SensorMon	*volt;	gfloat		v;	gboolean	tmp, result = FALSE;	/* This routine can be called before any volt decals exist, but reading	|  voltages can trigger alerts which expect to find decals.  Hence freeze.	*/	tmp = thread_data_valid;	thread_data_valid = FALSE;	/* Need results immediately */	for (list = volt_list; list; list = list->next)		{		volt = (SensorMon *) list->data;		gkrellm_freeze_alert(volt->sensor->alert);		s = volt->sensor->vref;		if (s && s->value == 0)			sensor_read_voltage(s, &v);		sensor_read_voltage(volt->sensor, &v);		gkrellm_thaw_alert(volt->sensor->alert);		if (v < 0.0)			{			result = TRUE;			break;			}		}	thread_data_valid = tmp;	return result;	}static voidmake_volt_decals(GkrellmPanel *p, GkrellmStyle *style)	{	GList				*list;	GkrellmBorder		*b	= &bezel_style->border;	Sensor				*sensor;	SensorMon			*volt;	GkrellmDecal		*dv, *dn;	GkrellmTextstyle	*ts_volt, *ts_name;	gchar				*fmt;	gint				w_volt;	ts_name = gkrellm_meter_alt_textstyle(style_id);	ts_volt = gkrellm_meter_textstyle(style_id);	volt_mon_width = 0;	volt_mon_height = 0;	volt_name_width = 0;	w_volt = 0;	minus_width = 0;	have_negative_volts = FALSE;	fmt = "8.88";	if (any_negative_volts())		{		have_negative_volts = TRUE;		minus_width = 1;		fmt = "-8.88";		}	for (list = volt_list; list; list = list->next)		{		volt = (SensorMon *) list->data;		sensor = volt->sensor;		if (display_mode == DIGITAL_WITH_LABELS)			{			volt->name_decal = dn = gkrellm_create_decal_text(p,						volt->sensor->name_locale, ts_name, style, 0, 0, 0);			if (dn->w > volt_name_width)				volt_name_width = dn->w;			}		dv = gkrellm_create_decal_text(p, fmt, ts_volt, style, 0, 0, 0);		volt->sensor_decal = dv;		if (minus_width == 1)			minus_width = gkrellm_gdk_string_width(dv->text_style.font, "-");		w_volt = dv->w;			/* Same for all volt decals */		if (dv->h > volt_mon_height)			volt_mon_height = dv->h;		sensor->cb_alert = cb_alert_trigger;		sensor->cb_alert_data = volt;		gkrellm_alert_trigger_connect(sensor->alert, cb_alert_trigger, volt);		gkrellm_alert_command_process_connect(sensor->alert,					cb_command_process, sensor);		gkrellm_reset_alert_soft(sensor->alert);		}	pixel_grub = minus_width ? 1 : 0;	volt_bezel_width = b->left + w_volt + b->right - pixel_grub;	volt_mon_height += b->top + b->bottom;	/* If name decal I let bezel left border encroach into NAME_PAD space

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?