Hi,

This is a patch to fix these:

https://bugs.launchpad.net/ubuntu/+source/devicekit-power/+bug/403303
https://bugs.launchpad.net/ubuntu/+source/gnome-power-manager/+bug/460631
https://bugzilla.redhat.com/show_bug.cgi?id=439460
http://ubuntuforums.org/showthread.php?t=1317434
https://bugs.launchpad.net/ubuntu/+source/devicekit-power/+bug/403303

This is a hardware bug. It could also be fixed at the ACPI level,
but having this fix here doesn't hurt.

Tested on Ubuntu 10.04 Desktop, 2.6.32-24-generic.
The patch is against upower 0.9.1-1

Regards,

-- 
M
diff -rc upower-0.9.1-origdeb/src/linux/up-device-supply.c upower-0.9.1/src/linux/up-device-supply.c
*** upower-0.9.1-origdeb/src/linux/up-device-supply.c	2010-02-10 18:09:31.000000000 +0100
--- upower-0.9.1/src/linux/up-device-supply.c	2010-09-02 18:13:24.263856783 +0200
***************
*** 48,53 ****
--- 48,56 ----
  {
  	guint			 poll_timer_id;
  	gboolean		 has_coldplug_values;
+ 	// Some notbooks (asus eeepc 900 series is an example) report 'charge_full'
+ 	// and 'charge' in percetages (instead of mAh). Let' fix that.
+ 	gboolean		 broken_percentage_reporting;
  	gdouble			 energy_old;
  	GTimeVal		 energy_old_timespec;
  	guint			 unknown_retries;
***************
*** 91,96 ****
--- 94,100 ----
  	UpDevice *device = UP_DEVICE (supply);
  
  	supply->priv->has_coldplug_values = FALSE;
+ 	supply->priv->broken_percentage_reporting = FALSE;
  	supply->priv->energy_old = 0;
  	supply->priv->energy_old_timespec.tv_sec = 0;
  
***************
*** 474,481 ****
--- 478,494 ----
  		if (energy == 0) {
  			energy_full = sysfs_get_double (native_path, "charge_full") / 1000000.0;
  			energy_full_design = sysfs_get_double (native_path, "charge_full_design") / 1000000.0;
+ 			if (energy_full <= 0.101) {  // 0.1 = 100 mAh (100%)
+ 				energy_full = energy_full * 10 * energy_full_design;
+ 				supply->priv->broken_percentage_reporting = TRUE;
+ 			}	
  			energy_full *= voltage_design;
  			energy_full_design *= voltage_design;
+ 		} else {
+ 			if (energy_full <= 0.101) {  // 0.1 = 100 mAh (100%)
+ 				energy_full = energy_full * 10 * energy_full_design;
+ 				supply->priv->broken_percentage_reporting = TRUE;
+ 			}	
  		}
  
  		/* the last full should not be bigger than the design */
***************
*** 544,551 ****
--- 557,571 ----
  		energy = sysfs_get_double (native_path, "charge_now") / 1000000.0;
  		if (energy == 0)
  			energy = sysfs_get_double (native_path, "charge_avg") / 1000000.0;
+ 		if (supply->priv->broken_percentage_reporting) {
+ 			energy = energy * 10 * energy_full_design / voltage_design;
+ 		}
  		energy *= voltage_design;
  		energy_rate *= voltage_design;
+ 	} else {
+ 		if (supply->priv->broken_percentage_reporting) {
+ 			energy = energy * 10 * energy_full_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