[gnome-battery-bench] PowerMonitor: use new power supply infrastructure
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-battery-bench] PowerMonitor: use new power supply infrastructure
- Date: Mon, 3 Apr 2017 15:37:56 +0000 (UTC)
commit d71e28a893d66d3099e6252037e4122dfab20a2d
Author: Christian Kellner <gicmo gnome org>
Date: Sun Mar 19 22:41:51 2017 +0000
PowerMonitor: use new power supply infrastructure
src/power-monitor.c | 283 +++++++++------------------------------------------
1 files changed, 49 insertions(+), 234 deletions(-)
---
diff --git a/src/power-monitor.c b/src/power-monitor.c
index e00e48b..96f5dc5 100644
--- a/src/power-monitor.c
+++ b/src/power-monitor.c
@@ -5,6 +5,7 @@
#include <gio/gio.h>
#include "power-monitor.h"
+#include "power-supply.h"
/* Time between reading values out of proc (ms) */
#define UPDATE_FREQUENCY 250
@@ -21,26 +22,6 @@ struct _GbbPowerMonitorClass {
GObjectClass parent_class;
};
-typedef struct {
-} BatteryState;
-
-typedef struct {
- GFile *directory;
- double energy_now;
- double energy_full;
- double energy_full_design;
- double charge_now;
- double charge_full;
- double charge_full_design;
- double capacity_now;
- double voltage_now;
-} Battery;
-
-typedef struct {
- GFile *directory;
- gboolean online;
-} Adapter;
-
enum {
CHANGED,
LAST_SIGNAL
@@ -76,12 +57,7 @@ gbb_power_state_equal(GbbPowerState *a,
return (a->online == b->online &&
a->energy_now == b->energy_now &&
a->energy_full == b->energy_full &&
- a->energy_full_design == b->energy_full_design &&
- a->charge_now == b->charge_now &&
- a->charge_full == b->charge_full &&
- a->charge_full_design == b->charge_full_design &&
- a->capacity_now == b->capacity_now &&
- a->voltage_now == b->voltage_now);
+ a->energy_full_design == b->energy_full_design);
}
void
@@ -90,179 +66,38 @@ gbb_power_statistics_free (GbbPowerStatistics *statistics)
g_slice_free(GbbPowerStatistics, statistics);
}
-static char *
-get_file_contents_string (GFile *directory,
- char *child,
- GCancellable *cancellable,
- GError **error)
-{
- GFile *file = g_file_get_child(directory, child);
- char *contents;
- if (!g_file_load_contents(file, cancellable, &contents, NULL, NULL, error))
- contents = NULL;
-
- g_object_unref (file);
- return contents;
-}
static gboolean
-get_file_contents_int (GFile *directory,
- char *child,
- int *result,
- GCancellable *cancellable,
- GError **error)
-{
- char *contents = get_file_contents_string(directory, child, cancellable, error);
- if (contents) {
- *result = atoi (contents);
- g_free (contents);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static gboolean
-get_file_contents_double (GFile *directory,
- char *child,
- double *result,
- GCancellable *cancellable,
- GError **error)
-{
- int result_int;
- if (get_file_contents_int (directory, child, &result_int, cancellable, error)) {
- *result = result_int / 1000000.;
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static void
-battery_poll(Battery *battery)
-{
- battery->energy_now = -1.0;
- battery->energy_full = -1.0;
- battery->energy_full_design = -1.0;
- battery->charge_now = -1.0;
- battery->charge_full = -1.0;
- battery->charge_full_design = -1.0;
- battery->capacity_now = -1.0;
- battery->voltage_now = -1.0;
-
- get_file_contents_double (battery->directory, "energy_now", &battery->energy_now, NULL, NULL);
- if (battery->energy_now >= 0) {
- GError *error = NULL;
- get_file_contents_double (battery->directory, "energy_full", &battery->energy_full, NULL, NULL);
- get_file_contents_double (battery->directory, "energy_full_design", &battery->energy_full_design,
NULL, &error);
- return;
- }
- get_file_contents_double (battery->directory, "charge_now", &battery->charge_now, NULL, NULL);
- if (battery->charge_now >= 0) {
- get_file_contents_double (battery->directory, "charge_full", &battery->charge_full, NULL, NULL);
- get_file_contents_double (battery->directory, "charge_full_design", &battery->charge_full_design,
NULL, NULL);
- get_file_contents_double (battery->directory, "voltage_now", &battery->voltage_now, NULL, NULL);
- return;
- }
-
- int capacity;
- if (get_file_contents_int (battery->directory, "capacity_now", &capacity, NULL, NULL))
- battery->capacity_now = capacity / 100.;
-}
-
-static Battery *
-battery_new (GFile *directory)
-{
- Battery *battery = g_slice_new0(Battery);
- battery->directory = g_object_ref(directory);
- battery_poll(battery);
-
- return battery;
-}
-
-static void
-battery_free (Battery *battery)
-{
- g_object_unref(battery->directory);
- g_slice_free(Battery, battery);
-}
-
-static void
-adapter_poll(Adapter *adapter)
+find_power_supplies(GbbPowerMonitor *monitor,
+ GCancellable *cancellable,
+ GError **error)
{
- int online;
-
- if (get_file_contents_int (adapter->directory, "online", &online, NULL, NULL))
- adapter->online = online != 0;
- else
- adapter->online = FALSE;
-}
-static Adapter *
-adapter_new(GFile *directory)
-{
- Adapter *adapter = g_slice_new0(Adapter);
- adapter->directory = g_object_ref(directory);
- adapter_poll(adapter);
+ GList *supplies;
+ GList *l;
- return adapter;
-}
+ supplies = gbb_power_supply_discover();
-static void
-adapter_free (Adapter *adapter)
-{
- g_object_unref(adapter->directory);
- g_slice_free(Adapter, adapter);
-}
+ for (l = supplies; l != NULL; l = l->next) {
+ if (GBB_IS_BATTERY(l->data)) {
+ monitor->batteries = g_list_prepend(monitor->batteries, l->data);
+ } else if (GBB_IS_MAINS(l->data)) {
+ monitor->adapters = g_list_prepend(monitor->adapters, l->data);
+ } else {
+ g_assert_not_reached();
+ }
+ }
-static gboolean
-is_adapter(const char *name)
-{
- return g_str_has_prefix(name, "AC") || g_str_has_prefix(name, "ADP");
-}
+ g_list_free(supplies);
-static gboolean
-find_power_supplies(GbbPowerMonitor *monitor,
- GCancellable *cancellable,
- GError **error)
-{
- GFile *file = g_file_new_for_path ("/sys/class/power_supply");
- GFileEnumerator *enumerator = NULL;
-
- enumerator = g_file_enumerate_children (file,
- "standard::name,standard::type",
- G_FILE_QUERY_INFO_NONE,
- cancellable, error);
- if (!enumerator)
- goto out;
-
- while (*error == NULL) {
- GFileInfo *info = g_file_enumerator_next_file (enumerator, cancellable, error);
- GFile *child = NULL;
- if (*error != NULL)
- goto out;
- else if (!info)
- break;
-
- if (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)
- goto next;
-
- child = g_file_enumerator_get_child (enumerator, info);
-
- const char *basename = g_file_info_get_name (info);
- if (g_str_has_prefix (basename, "BAT"))
- monitor->batteries = g_list_prepend (monitor->batteries, battery_new (child));
- else if (is_adapter (basename))
- monitor->adapters = g_list_prepend (monitor->adapters, adapter_new (child));
- next:
- g_clear_object (&child);
- g_clear_object (&info);
+ if (monitor->batteries == NULL) {
+ g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "No batteries found!");
+ } else if (monitor->adapters == NULL) {
+ g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "No power adapter found!");
}
-out:
- g_clear_object (&file);
- g_clear_object (&enumerator);
-
return *error == NULL;
}
@@ -271,8 +106,8 @@ gbb_power_monitor_finalize(GObject *object)
{
GbbPowerMonitor *monitor = GBB_POWER_MONITOR(object);
- g_list_foreach(monitor->batteries, (GFunc)battery_free, NULL);
- g_list_foreach(monitor->adapters, (GFunc)adapter_free, NULL);
+ g_list_foreach(monitor->batteries, (GFunc)g_object_unref, NULL);
+ g_list_foreach(monitor->adapters, (GFunc)g_object_unref, NULL);
G_OBJECT_CLASS(gbb_power_monitor_parent_class)->finalize(object);
}
@@ -346,59 +181,39 @@ read_state(GbbPowerMonitor *monitor,
gbb_power_state_init(state);
state->time_us = g_get_monotonic_time();
- g_list_foreach (monitor->adapters, (GFunc)adapter_poll, NULL);
- g_list_foreach (monitor->batteries, (GFunc)battery_poll, NULL);
-
for (l = monitor->adapters; l; l = l->next) {
- Adapter *adapter = l->data;
- if (adapter->online)
+ GbbMains *mains = l->data;
+ gboolean online = gbb_mains_poll(mains);
+
+ if (online)
state->online = TRUE;
}
for (l = monitor->batteries; l; l = l->next) {
- Battery *battery = l->data;
- if (battery->energy_now >= 0) {
- add_to (&state->energy_now, battery->energy_now);
- add_to (&state->energy_full, battery->energy_full);
-
- if (battery->energy_full_design >= 0) {
- if (n_batteries == 0 || state->energy_full_design >= 0)
- add_to (&state->energy_full_design, battery->energy_full_design);
- } else {
- state->energy_full_design = -1;
- }
- } else if (battery->charge_now >= 0) {
- add_to (&state->charge_now, battery->charge_now);
- add_to (&state->charge_full, battery->charge_full);
-
- if (battery->charge_full_design >= 0) {
- if (n_batteries == 0 || state->charge_full_design >= 0)
- add_to (&state->charge_full_design, battery->charge_full_design);
- } else {
- state->charge_full_design = -1;
- }
- } else if (battery->capacity_now >= 0) {
- add_to (&state->capacity_now, battery->capacity_now);
+ GbbBattery *battery = l->data;
+ double energy_now = gbb_battery_poll(battery);
+ double energy_full = -1.0;
+ double energy_full_design = -1.0;
+
+ g_object_get(battery,
+ "energy-full", &energy_full,
+ "energy-full-design", &energy_full_design,
+ NULL);
+
+ add_to (&state->energy_now, energy_now);
+ add_to (&state->energy_full, energy_full);
+
+ if (energy_full_design >= 0) {
+ if (n_batteries == 0 || state->energy_full_design >= 0)
+ add_to (&state->energy_full_design, energy_full_design);
+ } else {
+ state->energy_full_design = -1;
}
- /* state->voltage_now only makes sense if there is a single battery */
- if (n_batteries == 0)
- state->voltage_now = battery->voltage_now;
- else
- state->voltage_now = -1.0;
-
+ state->voltage_now = -1.0;
n_batteries += 1;
}
- if ((state->energy_now >= 0 ? 1 : 0) +
- (state->charge_now >= 0 ? 1 : 0) +
- (state->capacity_now >= 0 ? 1 : 0) > 1) {
- g_error ("Different batteries have different accounting methods");
- }
-
- if (state->capacity_now >= 0)
- state->capacity_now /= n_batteries;
-
return state;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]