More cleanly support batteries that report both energy and charge,
but do not report power_now. One battery driver in drivers/power
(bq20z75) supports reporting energy and charge natively from the
fuel gauge, but does not report power_now. The previous legacy behavior
would ignore the existence of charge and treat current_now as
being in units of power.

Signed-off-by: Benson Leung <ble...@chromium.org>

Version history : 
v3 - Change the patch to more closely match upower style. Separate
charge to energy conversion and energy_rate decision to make it
more easy to follow.

--
diff -rupN a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
--- a/src/linux/up-device-supply.c      2011-03-24 11:02:51.322591000 -0700
+++ b/src/linux/up-device-supply.c      2011-03-24 11:17:06.232076000 -0700
@@ -554,11 +554,10 @@ up_device_supply_refresh_battery (UpDevi
                supply->priv->unknown_retries = 0;
        }
 
-       /* this is the new value in mWh */
+       /* this is the new value in uW */
        energy_rate = fabs (sysfs_get_double (native_path, "power_now") / 
1000000.0);
        if (energy_rate == 0) {
-               /* get the old rate, rate; which is either in uVh or uWh */
-               energy_rate = fabs (sysfs_get_double (native_path, 
"current_now") / 1000000.0);
+               gdouble charge_full;
 
                /* convert charge to energy */
                if (energy == 0) {
@@ -566,8 +565,18 @@ up_device_supply_refresh_battery (UpDevi
                        if (energy == 0)
                                energy = sysfs_get_double (native_path, 
"charge_avg") / 1000000.0;
                        energy *= voltage_design;
-                       energy_rate *= voltage_design;
                }
+
+                charge_full = sysfs_get_double (native_path, "charge_full") / 
1000000.0;
+                if (charge_full == 0)
+                        charge_full = sysfs_get_double (native_path, 
"charge_full_design") / 1000000.0;
+
+                /* If charge_full exists, then current_now is always reported 
in uA.
+                 * In the legacy case, where energy only units exist, and 
power_now isn't present
+                 * current_now is power in uW. */
+               energy_rate = fabs (sysfs_get_double (native_path, 
"current_now") / 1000000.0);
+               if (charge_full != 0)
+                       energy_rate *= voltage_design;
        }
 
        /* some batteries don't update last_full attribute */
_______________________________________________
devkit-devel mailing list
devkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/devkit-devel

Reply via email to