summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/linux/up-device-supply.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
index c4553cd..0b8a0eb 100644
--- a/src/linux/up-device-supply.c
+++ b/src/linux/up-device-supply.c
@@ -807,6 +807,68 @@ out:
}
/**
+ * up_device_supply_refresh_device:
+ *
+ * Return %TRUE on success, %FALSE if we failed to refresh or no data
+ **/
+static gboolean
+up_device_supply_refresh_device (UpDeviceSupply *supply)
+{
+ gboolean ret = TRUE;
+ UpDeviceState state;
+ UpDevice *device = UP_DEVICE (supply);
+ const gchar *native_path;
+ GUdevDevice *native;
+ gdouble percentage = 0.0f;
+
+ native = G_UDEV_DEVICE (up_device_get_native (device));
+ native_path = g_udev_device_get_sysfs_path (native);
+
+ /* initial values */
+ if (!supply->priv->has_coldplug_values) {
+ gchar *model_name;
+
+ /* get values which may be blank */
+ model_name = up_device_supply_get_string (native_path, "model_name");
+
+ /* some vendors fill this with binary garbage */
+ up_device_supply_make_safe_string (model_name);
+
+ g_object_set (device,
+ "is-present", TRUE,
+ "model", model_name,
+ "is-rechargeable", TRUE,
+ "has-history", TRUE,
+ "has-statistics", TRUE,
+ "power-supply", supply->priv->is_power_supply, /* always FALSE */
+ NULL);
+
+ /* we only coldplug once, as these values will never change */
+ supply->priv->has_coldplug_values = TRUE;
+
+ g_free (model_name);
+ }
+
+ /* get a precise percentage */
+ percentage = sysfs_get_double (native_path, "capacity");
+
+ state = up_device_supply_get_state (native_path);
+
+ /* reset unknown counter */
+ if (state != UP_DEVICE_STATE_UNKNOWN) {
+ g_debug ("resetting unknown timeout after %i retries", supply->priv->unknown_retries);
+ supply->priv->unknown_retries = 0;
+ }
+
+ g_object_set (device,
+ "percentage", percentage,
+ "state", state,
+ NULL);
+
+ return ret;
+}
+
+/**
* up_device_supply_poll_battery:
**/
static gboolean
@@ -1017,7 +1079,10 @@ up_device_supply_refresh (UpDevice *device)
ret = up_device_supply_refresh_line_power (supply);
break;
default:
- ret = up_device_supply_refresh_battery (supply);
+ if (supply->priv->is_power_supply)
+ ret = up_device_supply_refresh_battery (supply);
+ else
+ ret = up_device_supply_refresh_device (supply);
/* Seems that we don't get change uevents from the
* kernel on some BIOS types */