[Powertop] [PATCH 05/10] power_meter: introduce discharging member measurement: report total global_time_left()

Sergey Senozhatsky <sergey.senozhatsky at gmail.com>
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
report total capacity and discahrge rate if at least one power_meter
reports that is's discharging. previously we reported only discharging
power_meters, thus user was not aware of total time left in case of
N batteries. this is the reason why power_meter discharging member
(with getter and setter one-liners were introduced) -- we need
capacity and rate for every power_meter, regardless the fact whether
its /sys/class/power_supply/*/status reports "Discharging" or not.
report total "The battery discharge rate" and "The estimated remaining
time" back to user when at least one power_meter is discharging.

Reported-and-tested-by: Maksim Melnikau <maxposedon(a)gmail.com>
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky(a)gmail.com>
---
 src/measurement/measurement.cpp | 32 ++++++++++++++------------------
 src/measurement/measurement.h   | 24 +++++++++++++++++-------
 src/measurement/sysfs.cpp       |  7 ++++---
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/src/measurement/measurement.cpp b/src/measurement/measurement.cpp
index 0b68940..8b63eb3 100644
--- a/src/measurement/measurement.cpp
+++ b/src/measurement/measurement.cpp
@@ -54,23 +54,6 @@ double power_meter::joules_consumed(void)
 	return 0.0;
 }
 
-double power_meter::time_left(void)
-{
-	double cap, rate;
-
-	cap = dev_capacity();
-	rate = joules_consumed();
-
-	if (cap < 0.001)
-		return 0.0;
-
-	/* return 0.0 instead of INF+ */
-	if (rate < 0.001)
-		return 0.0;
-
-	return cap / rate;
-}
-
 vector<class power_meter *> power_meters;
 
 void start_power_measurement(void)
@@ -88,10 +71,17 @@ void end_power_measurement(void)
 
 double global_joules_consumed(void)
 {
+	bool global_discharging = false;
 	double total = 0.0;
 	unsigned int i;
-	for (i = 0; i < power_meters.size(); i++)
+
+	for (i = 0; i < power_meters.size(); i++) {
+		global_discharging |= power_meters[i]->is_discharging();
 		total += power_meters[i]->joules_consumed();
+	}
+	/* report global time left if at least one battery is discharging */
+	if (!global_discharging)
+		return 0.0;
 
 	all_results.power = total;
 	if (total < min_power && total > 0.01)
@@ -101,13 +91,19 @@ double global_joules_consumed(void)
 
 double global_time_left(void)
 {
+	bool global_discharging = false;
 	double total_capacity = 0.0;
 	double total_rate = 0.0;
 	unsigned int i;
 	for (i = 0; i < power_meters.size(); i++) {
+		global_discharging |= power_meters[i]->is_discharging();
 		total_capacity += power_meters[i]->dev_capacity();
 		total_rate += power_meters[i]->joules_consumed();
 	}
+	/* report global time left if at least one battery is discharging */
+	if (!global_discharging)
+		return 0.0;
+
 	/* return 0.0 instead of INF+ */
 	if (total_rate < 0.001)
 		return 0.0;
diff --git a/src/measurement/measurement.h b/src/measurement/measurement.h
index 5bcd8e2..83ffc34 100644
--- a/src/measurement/measurement.h
+++ b/src/measurement/measurement.h
@@ -30,18 +30,29 @@
 using namespace std;
 
 class power_meter {
+	bool discharging;
 public:
+	virtual ~power_meter() {};
+
 	virtual void start_measurement(void);
 	virtual void end_measurement(void);
-
 	virtual double joules_consumed(void);
-	virtual double dev_capacity(void) { return 0.0;};  /* in Joules */
 
-	virtual double time_left(void);
+	virtual double dev_capacity(void)
+	{
+		return 0.0; /* in Joules */
+	}
 
-	virtual ~power_meter() {};
-};
+	virtual void set_discharging(bool d)
+	{
+		discharging = d;
+	}
 
+	virtual bool is_discharging()
+	{
+		return discharging;
+	}
+};
 
 extern vector<class power_meter *> power_meters;
 
@@ -53,7 +64,6 @@ extern double global_time_left(void);
 extern void detect_power_meters(void);
 extern void extech_power_meter(const char *devnode);
 
-
 extern double min_power;
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/measurement/sysfs.cpp b/src/measurement/sysfs.cpp
index 66cb1cd..ed42ed4 100644
--- a/src/measurement/sysfs.cpp
+++ b/src/measurement/sysfs.cpp
@@ -126,11 +126,13 @@ void sysfs_power_meter::measure()
 
 	rate = 0.0;
 	capacity = 0.0;
+	this->set_discharging(false);
 
 	if (!is_present())
 		return;
-	if (read_sysfs_string("/sys/class/power_supply/%s/status", name) != "Discharging")
-		return;
+	/** do not jump over. we may have discharging battery */
+	if (read_sysfs_string("/sys/class/power_supply/%s/status", name) == "Discharging")
+		this->set_discharging(true);
 
 	got_rate = set_rate_from_power();
 	got_capacity = set_capacity_from_energy();
@@ -146,7 +148,6 @@ void sysfs_power_meter::measure()
 	}
 }
 
-
 void sysfs_power_meter::end_measurement(void)
 {
 	measure();
-- 
1.8.4.679.g0a1a803
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.