add a window to display the stats of thermal, cooling zones and also
information given by the hwmon sensor.

Signed-off-by: Sanjay Singh Rawat <sanjay.ra...@linaro.com>
---
 src/Makefile.am             |    2 +-
 src/display.cpp             |    1 +
 src/main.cpp                |    3 +-
 src/measurement/thermal.cpp |  148 +++++++++++++++++++++++++++++++++++++++++++
 src/measurement/thermal.h   |    1 +
 5 files changed, 153 insertions(+), 2 deletions(-)
 create mode 100644 src/measurement/thermal.cpp
 create mode 100644 src/measurement/thermal.h

diff --git a/src/Makefile.am b/src/Makefile.am
index f60426a..335fb6c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,7 +34,7 @@ powertop_SOURCES = parameters/persistent.cpp 
parameters/learn.cpp parameters/par
                report/report-formatter-base.cpp report/report-formatter-base.h 
\
                report/report-formatter-csv.cpp report/report-formatter-csv.h \
                report/report-formatter-html.cpp report/report-formatter-html.h 
\
-               main.cpp css.h powertop.css cpu/intel_gpu.cpp
+               main.cpp css.h powertop.css cpu/intel_gpu.cpp 
measurement/thermal.h measurement/thermal.cpp
 
 
 powertop_CXXFLAGS = -fno-omit-frame-pointer -fstack-protector -Wall -Wshadow 
-Wformat $(NCURSES_CFLAGS) $(PCIUTILS_CFLAGS) $(LIBNL_CFLAGS) $(GLIB2_CFLAGS)
diff --git a/src/display.cpp b/src/display.cpp
index c76ba27..adcf80d 100644
--- a/src/display.cpp
+++ b/src/display.cpp
@@ -71,6 +71,7 @@ void init_display(void)
        create_tab("Idle stats", _("Idle stats"));
        create_tab("Frequency stats", _("Frequency stats"));
        create_tab("Device stats", _("Device stats"));
+       create_tab("Thermal stats", _("Thermal stats"));
 
        display = 1;
 }
diff --git a/src/main.cpp b/src/main.cpp
index e6036ae..e649919 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -51,7 +51,7 @@
 #include "parameters/parameters.h"
 #include "calibrate/calibrate.h"
 
-
+#include "measurement/thermal.h"
 #include "tuning/tuning.h"
 
 #include "display.h"
@@ -214,6 +214,7 @@ void one_measurement(int seconds, char *workload)
        report_display_cpu_pstates();
        report_process_update_display();
 
+       thermal_update_display();
        tuning_update_display();
 
        end_process_data();
diff --git a/src/measurement/thermal.cpp b/src/measurement/thermal.cpp
new file mode 100644
index 0000000..c2c4c11
--- /dev/null
+++ b/src/measurement/thermal.cpp
@@ -0,0 +1,148 @@
+/*
+ * This is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * getopt code is taken from "The GNU C Library" reference manual,
+ * section 24.2 "Parsing program options using getopt"
+ * http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html
+ * Manual published under the terms of the Free Documentation License.
+ */
+
+#include <stdlib.h>
+#include <ncurses.h>
+#include "../display.h"
+#include "../lib.h"
+
+enum attr_length {
+       SHORTT,
+       LONGT
+};
+
+static int get_thermal_attr(WINDOW *win, char *zone, const char *attr, int 
wide)
+{
+        char buf[512];
+        int val;
+        string line;
+
+       if(!wide)
+               wprintw(win,"%17s : ",attr);
+       else
+               wprintw(win,"%s : ",attr);
+        for(val=0 ; val<255 ; val++) {
+            sprintf(buf,"%s%d/%s",zone,val,attr);
+                       if (access(buf, R_OK) !=0) {
+                               wprintw(win,"  *\n");
+                               return -1;
+               }
+                line = read_sysfs_string("%s", buf);
+               wprintw(win,"  %s  -",line.c_str());
+        }
+        wprintw(win,"\n");
+       return 0;
+}
+
+static int get_thermal_zone_info(WINDOW *win)
+{
+       char linebuf[1024];
+       string line;
+
+       sprintf(linebuf,"/sys/class/thermal/thermal_zone");
+
+       wprintw(win,"\n[Zone : 
Thermal]----------------------------------------------\n");
+       get_thermal_attr(win, linebuf, "type",SHORTT);
+       get_thermal_attr(win, linebuf, "temp",SHORTT);
+       get_thermal_attr(win, linebuf, "mode",SHORTT);
+       get_thermal_attr(win, linebuf, "policy",SHORTT);
+       get_thermal_attr(win, linebuf, "passive",SHORTT);
+       //todo: currently assuming only 3 trip points
+       get_thermal_attr(win, linebuf, "trip_point_0_temp",LONGT);
+       get_thermal_attr(win, linebuf, "trip_point_0_type",LONGT);
+       get_thermal_attr(win, linebuf, "trip_point_1_temp",LONGT);
+       get_thermal_attr(win, linebuf, "trip_point_1_type",LONGT);
+       get_thermal_attr(win, linebuf, "trip_point_2_temp",LONGT);
+       get_thermal_attr(win, linebuf, "trip_point_2_type",LONGT);
+
+       return 0;
+}
+
+static int get_cooling_zone_info(WINDOW *win)
+{
+        char linebuf[1024];
+        string line;
+
+       sprintf(linebuf,"/sys/class/thermal/cooling_device");
+
+        wprintw(win,"\n[Zone : 
Cooling]----------------------------------------------\n");
+       get_thermal_attr(win, linebuf, "type",SHORTT);
+       get_thermal_attr(win, linebuf, "cur_state",SHORTT);
+       get_thermal_attr(win, linebuf, "max_state",SHORTT);
+
+       return 0;
+}
+
+static int get_hwmon_info(WINDOW *win)
+{
+       char linebuf[1024];
+        string line;
+
+       sprintf(linebuf,"/sys/class/hwmon/hwmon");
+
+       wprintw(win,"\n[HWMON 
info]--------------------------------------------------\n");
+       get_thermal_attr(win, linebuf, "name",SHORTT);
+       get_thermal_attr(win, linebuf, "temp1_input",SHORTT);
+       get_thermal_attr(win, linebuf, "temp1_crit",SHORTT);
+       get_thermal_attr(win, linebuf, "temp1_max",SHORTT);
+       get_thermal_attr(win, linebuf, "temp2_input",SHORTT);
+       get_thermal_attr(win, linebuf, "temp2_crit",SHORTT);
+       get_thermal_attr(win, linebuf, "temp2_max",SHORTT);
+       get_thermal_attr(win, linebuf, "temp3_input",SHORTT);
+       get_thermal_attr(win, linebuf, "temp3_crit",SHORTT);
+       get_thermal_attr(win, linebuf, "temp3_max",SHORTT);
+       get_thermal_attr(win, linebuf, "fan1_input",SHORTT);
+       get_thermal_attr(win, linebuf, "fan2_input",SHORTT);
+       get_thermal_attr(win, linebuf, "fan3_input",SHORTT);
+       //todo: add more hwmon info
+
+       return 0;
+}
+
+void thermal_update_display(void)
+{
+       WINDOW *win;
+
+       win = get_ncurses_win("Thermal stats");
+        if (!win) {
+               printf("error: Window Thermal stats not found\n");
+                return;
+       }
+       wclear(win);
+       wmove(win, 1,0);
+
+       wprintw(win,"           *** Thermal window ***\n\n");
+       wprintw(win,"[Note: '*' means no-more/no parameters]\n\n");
+       wprintw(win,"[Params    :       Per-Devices-Info(1->n)]\n");
+       wprintw(win,"    |                      |\n");
+       wprintw(win,"    |                      |\n");
+       wprintw(win,"    V                      V");
+
+       get_cooling_zone_info(win);
+       get_thermal_zone_info(win);
+       get_hwmon_info(win);
+
+
+}
diff --git a/src/measurement/thermal.h b/src/measurement/thermal.h
new file mode 100644
index 0000000..104e968
--- /dev/null
+++ b/src/measurement/thermal.h
@@ -0,0 +1 @@
+extern void thermal_update_display(void);
-- 
1.7.9.5


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to