aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2010-09-24 20:34:31 -0700
committerArjan van de Ven <arjan@linux.intel.com>2010-09-24 20:34:31 -0700
commit25d2f78f347b8d9eaea7accd1fcced9812412b4a (patch)
tree088facb0358142e4ae17b0ada4339450d8f5a684
parentbc8b54e8e7a0c6465f7f01eca7ede178affc0a61 (diff)
downloadpowertop-25d2f78f347b8d9eaea7accd1fcced9812412b4a.tar.gz
add infrastructure to hide power data that is not valid
-rw-r--r--devices/ahci.h2
-rw-r--r--devices/alsa.cpp1
-rw-r--r--devices/alsa.h4
-rw-r--r--devices/device.cpp31
-rw-r--r--devices/device.h6
-rw-r--r--devices/rfkill.h2
-rw-r--r--devices/usb.h2
-rw-r--r--parameters/parameters.cpp44
-rw-r--r--parameters/parameters.h3
9 files changed, 90 insertions, 5 deletions
diff --git a/devices/ahci.h b/devices/ahci.h
index 24d86b8..39230a4 100644
--- a/devices/ahci.h
+++ b/devices/ahci.h
@@ -4,6 +4,7 @@
#include <string>
#include "device.h"
+#include "../parameters/parameters.h"
#include <stdint.h>
class ahci: public device {
@@ -31,6 +32,7 @@ public:
virtual const char * device_name(void);
virtual const char * human_name(void) { return humanname;};
virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle);
+ virtual int power_valid(void) { return utilization_power_valid(partial_rindex) + utilization_power_valid(active_rindex);};
};
extern void create_all_ahcis(void);
diff --git a/devices/alsa.cpp b/devices/alsa.cpp
index 9776adf..4d37c16 100644
--- a/devices/alsa.cpp
+++ b/devices/alsa.cpp
@@ -166,6 +166,7 @@ double alsa::power_usage(struct result_bundle *result, struct parameter_bundle *
power = 0;
if (!index)
index = get_param_index("alsa-codec-power");
+
factor = get_parameter_value(index, bundle);
utilization = get_result_value(rindex, result);
diff --git a/devices/alsa.h b/devices/alsa.h
index 31f9869..f174863 100644
--- a/devices/alsa.h
+++ b/devices/alsa.h
@@ -3,6 +3,8 @@
#include "device.h"
+#include "../parameters/parameters.h"
+
#include <stdint.h>
class alsa: public device {
@@ -26,6 +28,8 @@ public:
virtual const char * device_name(void);
virtual const char * human_name(void) { return humanname; };
virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle);
+ virtual int power_valid(void) { return utilization_power_valid(rindex);};
+
};
extern void create_all_alsa(void);
diff --git a/devices/device.cpp b/devices/device.cpp
index 0de679b..4d7989c 100644
--- a/devices/device.cpp
+++ b/devices/device.cpp
@@ -55,6 +55,13 @@ static bool power_device_sort(class device * i, class device * j)
pJ = j->power_usage(&all_results, &all_parameters);
if (pI == pJ) {
+ int vI, vJ;
+ vI = i->power_valid();
+ vJ = j->power_valid();
+
+ if (vI != vJ)
+ return vI > vJ;
+
return i->utilization() > j->utilization();
}
return pI > pJ;
@@ -66,6 +73,9 @@ void report_devices(void)
WINDOW *win;
unsigned int i;
+ char util[128];
+ char power[128];
+
win = tab_windows["Device stats"];
if (!win)
return;
@@ -77,9 +87,24 @@ void report_devices(void)
wprintw(win, "Device statistics\n");
for (i = 0; i < all_devices.size(); i++) {
- wprintw(win, "%5.1f%% %6.2fW %s \n",
- all_devices[i]->utilization(),
- all_devices[i]->power_usage(&all_results, &all_parameters),
+ double P;
+ sprintf(util, "%5.1f%s", all_devices[i]->utilization(), all_devices[i]->util_units());
+ while (strlen(util) < 9) strcat(util, " ");
+
+ P = all_devices[i]->power_usage(&all_results, &all_parameters);
+
+ if (P > 1.5)
+ sprintf(power, "%7.2fW ", P);
+ else
+ sprintf(power, "%7.2fmW", P*1000);
+
+ if (!all_devices[i]->power_valid())
+ strcpy(power, " ");
+
+
+ wprintw(win, "%s %s %s\n",
+ util,
+ power,
all_devices[i]->human_name()
);
}
diff --git a/devices/device.h b/devices/device.h
index 03a7a61..d2b9ff5 100644
--- a/devices/device.h
+++ b/devices/device.h
@@ -4,11 +4,11 @@
#include <vector>
+
struct parameter_bundle;
struct result_bundle;
class device {
-
public:
virtual void start_measurement(void);
@@ -16,6 +16,8 @@ public:
virtual double utilization(void); /* percentage */
+ virtual const char * util_units(void) { return "%"; };
+
virtual const char * class_name(void) { return "abstract device";};
virtual const char * device_name(void) { return "abstract device";};
@@ -24,6 +26,8 @@ public:
virtual double power_usage(struct result_bundle *results, struct parameter_bundle *bundle) { return 0.0; };
virtual bool show_in_list(void) {return true;};
+
+ virtual int power_valid(void) { return 1;};
};
using namespace std;
diff --git a/devices/rfkill.h b/devices/rfkill.h
index 02f5ba1..958a4d3 100644
--- a/devices/rfkill.h
+++ b/devices/rfkill.h
@@ -3,6 +3,7 @@
#include "device.h"
+#include "../parameters/parameters.h"
class rfkill: public device {
int start_soft, end_soft;
@@ -26,6 +27,7 @@ public:
virtual const char * device_name(void);
virtual const char * human_name(void) { return humanname; };
virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle);
+ virtual int power_valid(void) { return utilization_power_valid(rindex);};
};
extern void create_all_rfkills(void);
diff --git a/devices/usb.h b/devices/usb.h
index ae36e7d..709cfc8 100644
--- a/devices/usb.h
+++ b/devices/usb.h
@@ -3,6 +3,7 @@
#include "device.h"
+#include "../parameters/parameters.h"
class usbdevice: public device {
int active_before, active_after;
@@ -28,6 +29,7 @@ public:
virtual const char * device_name(void);
virtual const char * human_name(void);
virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle);
+ virtual int power_valid(void) { return utilization_power_valid(r_index);};
};
extern void create_all_usb_devices(void);
diff --git a/parameters/parameters.cpp b/parameters/parameters.cpp
index 7395d1a..9be9307 100644
--- a/parameters/parameters.cpp
+++ b/parameters/parameters.cpp
@@ -94,6 +94,8 @@ void set_result_value(const char *name, double value, struct result_bundle *the_
double get_result_value(int index, struct result_bundle *the_bundle)
{
+ if (!the_bundle)
+ return 0;
if (index >= (int) the_bundle->utilization.size())
return 0;
return the_bundle->utilization[index];
@@ -292,4 +294,44 @@ double average_power(void)
else
sum = 0.0001;
return sum;
-} \ No newline at end of file
+}
+
+int utilization_power_valid(const char *u)
+{
+ unsigned int i;
+ unsigned int index;
+ double first_value;
+
+ index = get_result_index(u);
+ if (index <= 0)
+ return 0;
+
+ first_value = past_results[0]->utilization[index];
+ for (i = 1; i < past_results.size(); i++) {
+ if (get_result_value(index, past_results[i]) < first_value - 0.0001)
+ return 1;
+ if (get_result_value(index, past_results[i]) > first_value + 0.0001)
+ return 1;
+ }
+
+ return 0;
+}
+
+int utilization_power_valid(int index)
+{
+ unsigned int i;
+ double first_value;
+
+ if (index <= 0)
+ return 0;
+
+ first_value = past_results[0]->utilization[index];
+ for (i = 1; i < past_results.size(); i++) {
+ if (get_result_value(index, past_results[i]) < first_value - 0.0001)
+ return 1;
+ if (get_result_value(index, past_results[i]) > first_value + 0.0001)
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/parameters/parameters.h b/parameters/parameters.h
index b30646c..43ca095 100644
--- a/parameters/parameters.h
+++ b/parameters/parameters.h
@@ -78,4 +78,7 @@ extern double bundle_power(struct parameter_bundle *parameters, struct result_bu
extern double average_power(void);
+extern int utilization_power_valid(const char *u);
+extern int utilization_power_valid(int index);
+
#endif