global_time_left() calculates total time left by summing up time_left()s of each battery.
usually only one battery is `active', thus others have rate close to 0.0 and, as a
result,
`cap / rate' reaching `INF+'.
accumulate total capacity and divide by total rate instead.
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky(a)gmail.com>
---
src/measurement/measurement.cpp | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/src/measurement/measurement.cpp b/src/measurement/measurement.cpp
index 4a33db9..0b68940 100644
--- a/src/measurement/measurement.cpp
+++ b/src/measurement/measurement.cpp
@@ -57,7 +57,6 @@ double power_meter::joules_consumed(void)
double power_meter::time_left(void)
{
double cap, rate;
- double left;
cap = dev_capacity();
rate = joules_consumed();
@@ -65,12 +64,13 @@ double power_meter::time_left(void)
if (cap < 0.001)
return 0.0;
- left = cap / rate;
+ /* return 0.0 instead of INF+ */
+ if (rate < 0.001)
+ return 0.0;
- return left;
+ return cap / rate;
}
-
vector<class power_meter *> power_meters;
void start_power_measurement(void)
@@ -101,12 +101,17 @@ double global_joules_consumed(void)
double global_time_left(void)
{
- double total = 0.0;
+ double total_capacity = 0.0;
+ double total_rate = 0.0;
unsigned int i;
- for (i = 0; i < power_meters.size(); i++)
- total += power_meters[i]->time_left();
-
- return total;
+ for (i = 0; i < power_meters.size(); i++) {
+ total_capacity += power_meters[i]->dev_capacity();
+ total_rate += power_meters[i]->joules_consumed();
+ }
+ /* return 0.0 instead of INF+ */
+ if (total_rate < 0.001)
+ return 0.0;
+ return total_capacity / total_rate;
}
void sysfs_power_meters_callback(const char *d_name)
Show replies by thread