Index: powermgmt.c =================================================================== RCS file: /cvsroot/rockbox/firmware/powermgmt.c,v retrieving revision 1.6 diff -u -b -r1.6 powermgmt.c --- powermgmt.c 15 Aug 2002 11:32:01 -0000 1.6 +++ powermgmt.c 21 Aug 2002 00:43:00 -0000 @@ -122,6 +122,7 @@ #ifdef HAVE_CHARGE_CTRL int delta; int charged_time = 0; + int charge_max_time_now; #endif while (1) @@ -162,11 +163,11 @@ if (charger_enabled) { /* charger inserted and enabled */ charged_time++; - if (charged_time > CHARGE_MAX_TIME) { - DEBUGF("power: charged_time > CHARGE_MAX_TIME, enough!\n"); + if (charged_time > charge_max_time_now) { + DEBUGF("power: charged_time > charge_max_time_now, enough!\n"); /* have charged too long and deltaV detection did not work! */ charger_enable(false); - snprintf(power_message, POWER_MESSAGE_LEN, "Chg tmout %d min", CHARGE_MAX_TIME); + snprintf(power_message, POWER_MESSAGE_LEN, "Chg tmout %d min", charge_max_time_now); /* Perhaps we should disable charging for several hours from this point, just to be sure. */ } else { @@ -211,7 +212,13 @@ DEBUGF("power: charger inserted and battery not full, enabling\n"); charger_enable(true); charged_time = 0; - snprintf(power_message, POWER_MESSAGE_LEN, "Chg started at %d%%", battery_level()); + /* calculate max charge time depending on current battery level */ + /* take 20% more because battery level is not linear */ + charge_max_time_now = CHARGE_MAX_TIME * (100 + 20 - battery_level()) / 100; + if (charge_max_time_now > CHARGE_MAX_TIME) { + charge_max_time_now = CHARGE_MAX_TIME; + } + snprintf(power_message, POWER_MESSAGE_LEN, "ChgAt %d%% max %dm", battery_level(), charge_max_time_now); } } } else { Index: powermgmt.h =================================================================== RCS file: /cvsroot/rockbox/firmware/powermgmt.h,v retrieving revision 1.4 diff -u -b -r1.4 powermgmt.h --- powermgmt.h 12 Aug 2002 12:19:25 -0000 1.4 +++ powermgmt.h 21 Aug 2002 00:43:01 -0000 @@ -39,7 +39,7 @@ #ifdef HAVE_CHARGE_CTRL #define POWER_MESSAGE_LEN 32 /* power thread status message */ -#define CHARGE_MAX_TIME 6*60 /* minutes: maximum charging time */ +#define CHARGE_MAX_TIME 8*60 /* minutes: maximum charging time */ #define CHARGE_MIN_TIME 10 /* minutes: minimum charging time */ #define CHARGE_RESTART_HI 90 /* %: when to restart charging in 'charge' mode */ #define CHARGE_RESTART_LO 10 /* %: when to restart charging in 'discharge' mode */