[PATCH] apm-emu displays time till battery is fully charged
Hi Ben & all,
I am using this patch since IIRC kernel 2.8. without trouble, and I
wonder what is needed to get it included in the kernel ? I posted it on
the kernel list, ben said some unconvincing words about it and it did
not get included :/
As it seems easy to do, if there is something I have to cleanup/think of
say so, or please include/push it otherwise.
It is nice having the gnome-battery applet display the time until the
battery is fully charged - isn't it ?
Soeren
PS: Please CC me.
--
Sometimes, there's a moment as you're waking, when you become aware of
the real world around you, but you're still dreaming.
--- t/linux-2.6.9-rc3/drivers/macintosh/apm_emu.c 2004-09-30 05:05:41.000000000 +0200
+++ linux-2.6.9-rc3-sonne/drivers/macintosh/apm_emu.c 2004-10-10 08:46:33.000000000 +0200
@@ -440,6 +440,7 @@
char * p = buf;
char charging = 0;
long charge = -1;
+ long max_charge = -1;
long amperage = 0;
unsigned long btype = 0;
@@ -450,9 +451,12 @@
percentage = 0;
if (charge < 0)
charge = 0;
+ if (max_charge < 0)
+ max_charge = 0;
percentage += (pmu_batteries[i].charge * 100) /
pmu_batteries[i].max_charge;
charge += pmu_batteries[i].charge;
+ max_charge += pmu_batteries[i].max_charge;
amperage += pmu_batteries[i].amperage;
if (btype == 0)
btype = (pmu_batteries[i].flags & PMU_BATT_TYPE_MASK);
@@ -461,13 +465,27 @@
charging++;
}
}
+
if (real_count) {
if (amperage < 0) {
+ /* when less than 100mA are used the machine must be on AC and as it is
+ not charging the battery is only slightly self decharging and thus full be definition */
+ if (amperage < -100) {
+ if (btype == PMU_BATT_TYPE_SMART)
+ time_units = (charge * 59) / (amperage * -1);
+ else
+ time_units = (charge * 16440) / (amperage * -60);
+ }
+ else
+ time_units = 0;
+ }
+ else if (amperage > 0 && max_charge >= charge) {
if (btype == PMU_BATT_TYPE_SMART)
- time_units = (charge * 59) / (amperage * -1);
+ time_units = ( (max_charge - charge) * 59) / amperage;
else
- time_units = (charge * 16440) / (amperage * -60);
+ time_units = ( (max_charge - charge) * 16440) / amperage;
}
+
percentage /= real_count;
if (charging > 0) {
battery_status = 0x03;
@@ -483,6 +501,7 @@
battery_flag = 0x01;
}
}
+
p += sprintf(p, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",
driver_version,
(FAKE_APM_BIOS_VERSION >> 8) & 0xff,
Reply to: