On 12 March 2013 17:15, Sanjay Singh Rawat <sanjay.ra...@linaro.org> wrote:
> add a window to display the stats of thermal, cooling zones and also
> information given by the hwmon sensor.

Nice window displaying thermal/hwmon sysfs information. Good enough to
start with. Any plans to process sysfs information and display more
useful stats like done in cpufreq and cpuidle stats? for instance how
long a cooling device was active and temperature drop as a result.

>
> 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"

Patch fails to compile for me. Need to include unistd.h for R_OK?

> +
> +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)

What happens when more enumerations are added?

> +               wprintw(win,"%17s : ",attr);
> +       else
> +               wprintw(win,"%s : ",attr);
> +        for(val=0 ; val<255 ; val++) {

Instead of using magic number here, why not dynamically detect
available thermal zones and cooling devices?

> +            sprintf(buf,"%s%d/%s",zone,val,attr);
> +                       if (access(buf, R_OK) !=0) {

Please follow powertop existing code for coding standards.

> +                               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

Again, why not dynamically detect available trip points to avoid
displaying unsupported parameters?

> +       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

Ditto.

> +
> +       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");

The current window tab says it's a thermal window. So this line can be removed.

> +       wprintw(win,"[Note: '*' means no-more/no parameters]\n\n");

Is it really required to mark end of parameters?

> +       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



-- 
Regards,
Rajagopal

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

Reply via email to