void is_temperature_sensor_set_scale(IsTemperatureSensor *self, IsTemperatureSensorScale scale) { IsTemperatureSensorPrivate *priv; g_return_if_fail(IS_IS_TEMPERATURE_SENSOR(self)); g_return_if_fail(scale == IS_TEMPERATURE_SENSOR_SCALE_CELSIUS || scale == IS_TEMPERATURE_SENSOR_SCALE_FAHRENHEIT); priv = self->priv; if (scale != priv->scale) { gdouble value = is_sensor_get_value(IS_SENSOR(self)); gdouble alarm_value = is_sensor_get_alarm_value(IS_SENSOR(self)); gdouble low_value = is_sensor_get_low_value(IS_SENSOR(self)); gdouble high_value = is_sensor_get_high_value(IS_SENSOR(self)); /* convert from current scale to new */ switch (priv->scale) { case IS_TEMPERATURE_SENSOR_SCALE_CELSIUS: value = celcius_to_fahrenheit(value); alarm_value = celcius_to_fahrenheit(alarm_value); low_value = celcius_to_fahrenheit(low_value); high_value = celcius_to_fahrenheit(high_value); break; case IS_TEMPERATURE_SENSOR_SCALE_FAHRENHEIT: value = fahrenheit_to_celcius(value); alarm_value = fahrenheit_to_celcius(alarm_value); low_value = fahrenheit_to_celcius(low_value); high_value = fahrenheit_to_celcius(high_value); break; case IS_TEMPERATURE_SENSOR_SCALE_INVALID: case NUM_IS_TEMPERATURE_SENSOR_SCALE: default: g_assert_not_reached(); break; } priv->scale = scale; is_sensor_set_units(IS_SENSOR(self), is_temperature_sensor_scale_to_string(priv->scale)); /* set all in one go */ g_object_set(self, "value", value, "alarm-value", alarm_value, "low-value", low_value, "high-value", high_value, NULL); } }
static void update_sensor_from_max(IsMaxPlugin *self) { IsMaxPluginPrivate *priv; gchar *label; priv = self->priv; label = g_strdup_printf("↑%s", is_sensor_get_label(priv->max)); is_sensor_set_label(priv->sensor, label); is_sensor_set_icon(priv->sensor, is_sensor_get_icon(priv->max)); is_sensor_set_value(priv->sensor, is_sensor_get_value(priv->max)); is_sensor_set_units(priv->sensor, is_sensor_get_units(priv->max)); is_sensor_set_digits(priv->sensor, is_sensor_get_digits(priv->max)); g_free(label); }
static void on_sensor_value_notify(IsSensor *sensor, GParamSpec *pspec, gpointer user_data) { IsMaxPlugin *self; IsMaxPluginPrivate *priv; gdouble value; self = IS_MAX_PLUGIN(user_data); priv = self->priv; value = is_sensor_get_value(sensor); if (value - IS_SENSOR_VALUE_UNSET <= DBL_EPSILON) { is_debug("max", "sensor value for sensor %s is unset - ignoring", is_sensor_get_label(sensor)); goto exit; } if (value > priv->max_value && sensor != priv->max) { // let's see if we can get away without taking a reference on sensor priv->max = sensor; is_message("max", "New highest value sensor: %s (value %f)", is_sensor_get_label(sensor), value); } if (sensor == priv->max) { priv->max_value = value; update_sensor_from_max(self); } exit: return; }
static void update_sensor_menu_item_label(IsIndicator *self, IsSensor *sensor, GtkMenuItem *menu_item) { gchar *text; text = g_strdup_printf("%s %2.*f%s", is_sensor_get_label(sensor), is_sensor_get_digits(sensor), is_sensor_get_value(sensor), is_sensor_get_units(sensor)); gtk_menu_item_set_label(menu_item, text); g_free(text); text = NULL; #if HAVE_APPINDICATOR if (sensor == self->priv->primary) { IsIndicatorPrivate *priv = self->priv; gboolean connected; g_object_get(self, "connected", &connected, NULL); /* using fallback so just set icon */ if (!connected) { app_indicator_set_icon_full(APP_INDICATOR(self), PACKAGE, is_sensor_get_label(sensor)); return; } if (priv->display_flags & IS_INDICATOR_DISPLAY_VALUE) { text = g_strdup_printf("%2.*f%s", is_sensor_get_digits(sensor), is_sensor_get_value(sensor), is_sensor_get_units(sensor)); } if (priv->display_flags & IS_INDICATOR_DISPLAY_LABEL) { /* join label to existing text - if text is NULL this will just show label */ text = g_strjoin(" ", is_sensor_get_label(sensor), text, NULL); } if (priv->display_flags & IS_INDICATOR_DISPLAY_ICON) { app_indicator_set_icon_full(APP_INDICATOR(self), is_sensor_get_icon_path(sensor), is_sensor_get_label(sensor)); } else { /* set to a 1x1 transparent icon for no icon */ app_indicator_set_icon_full(APP_INDICATOR(self), "indicator-sensors-no-icon", is_sensor_get_label(sensor)); } app_indicator_set_label(APP_INDICATOR(self), text, text); g_free(text); app_indicator_set_status(APP_INDICATOR(self), is_sensor_get_alarmed(sensor) ? APP_INDICATOR_STATUS_ATTENTION : APP_INDICATOR_STATUS_ACTIVE); } #else gtk_status_icon_set_from_icon_name(GTK_STATUS_ICON(self), PACKAGE); #endif }
static void on_sensor_value_notify(IsSensor *sensor, GParamSpec *pspec, gpointer user_data) { IsDynamicPlugin *self; IsDynamicPluginPrivate *priv; RateData *data; gdouble value, dv, dt, rate; gint64 now; self = IS_DYNAMIC_PLUGIN(user_data); priv = self->priv; value = is_sensor_get_value(sensor); if (value - IS_SENSOR_VALUE_UNSET <= DBL_EPSILON) { is_debug("dynamic", "sensor value for sensor %s is unset - ignoring", is_sensor_get_label(sensor)); goto exit; } now = g_get_monotonic_time(); data = g_object_get_data(G_OBJECT(sensor), DYNAMIC_RATE_DATA_KEY); if (data == NULL) { is_debug("dynamic", "Creating new dynamic rate data for sensor: %s", is_sensor_get_label(sensor)); // allocate data data = g_malloc0(sizeof(*data)); data->rate = 0.0f; data->last_value = value; data->last_time = now; g_object_set_data_full(G_OBJECT(sensor), DYNAMIC_RATE_DATA_KEY, data, g_free); goto exit; } is_debug("dynamic", "Got existing rate data for sensor: %s - rate: %f, last_value %f, last_time %"PRId64"", is_sensor_get_label(sensor), data->rate, data->last_value, data->last_time); dv = value - data->last_value; dt = ((double)(now - data->last_time) / (double)G_USEC_PER_SEC); // convert rate to units per second rate = fabs(dv / dt); is_debug("dynamic", "abs rate of change of sensor %s: %f (t0: %f, t-1: %f, dv: %f, dt: %f)", is_sensor_get_label(sensor), rate, value, data->last_value, dv, dt); // calculate exponentially weighted moving average of rate rate = (EWMA_ALPHA * rate) + ((1 - EWMA_ALPHA) * data->rate); data->rate = rate; data->last_value = value; data->last_time = now; is_debug("dynamic", "EWMA abs rate of change of sensor %s: %f", is_sensor_get_label(sensor), rate); if (rate > priv->max_rate && sensor != priv->max) { // let's see if we can get away without taking a reference on sensor priv->max = sensor; is_message("dynamic", "New highest EWMA rate sensor: %s (rate %f)", is_sensor_get_label(sensor), rate); } if (sensor == priv->max) { priv->max_rate = rate; update_sensor_from_max(self); } exit: return; }