diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2010-09-24 20:34:31 -0700 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2010-09-24 20:34:31 -0700 |
commit | 25d2f78f347b8d9eaea7accd1fcced9812412b4a (patch) | |
tree | 088facb0358142e4ae17b0ada4339450d8f5a684 | |
parent | bc8b54e8e7a0c6465f7f01eca7ede178affc0a61 (diff) | |
download | powertop-25d2f78f347b8d9eaea7accd1fcced9812412b4a.tar.gz |
add infrastructure to hide power data that is not valid
-rw-r--r-- | devices/ahci.h | 2 | ||||
-rw-r--r-- | devices/alsa.cpp | 1 | ||||
-rw-r--r-- | devices/alsa.h | 4 | ||||
-rw-r--r-- | devices/device.cpp | 31 | ||||
-rw-r--r-- | devices/device.h | 6 | ||||
-rw-r--r-- | devices/rfkill.h | 2 | ||||
-rw-r--r-- | devices/usb.h | 2 | ||||
-rw-r--r-- | parameters/parameters.cpp | 44 | ||||
-rw-r--r-- | parameters/parameters.h | 3 |
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 |