xref: /titanic_44/usr/src/cmd/powertop/common/suggestions.c (revision b47b5b34b42fa8056577c43496cdb99a4c99f8d7)
1*b47b5b34SRafael Vanoni /*
2*b47b5b34SRafael Vanoni  * Copyright 2009, Intel Corporation
3*b47b5b34SRafael Vanoni  * Copyright 2009, Sun Microsystems, Inc
4*b47b5b34SRafael Vanoni  *
5*b47b5b34SRafael Vanoni  * This file is part of PowerTOP
6*b47b5b34SRafael Vanoni  *
7*b47b5b34SRafael Vanoni  * This program file is free software; you can redistribute it and/or modify it
8*b47b5b34SRafael Vanoni  * under the terms of the GNU General Public License as published by the
9*b47b5b34SRafael Vanoni  * Free Software Foundation; version 2 of the License.
10*b47b5b34SRafael Vanoni  *
11*b47b5b34SRafael Vanoni  * This program is distributed in the hope that it will be useful, but WITHOUT
12*b47b5b34SRafael Vanoni  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*b47b5b34SRafael Vanoni  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*b47b5b34SRafael Vanoni  * for more details.
15*b47b5b34SRafael Vanoni  *
16*b47b5b34SRafael Vanoni  * You should have received a copy of the GNU General Public License
17*b47b5b34SRafael Vanoni  * along with this program in a file named COPYING; if not, write to the
18*b47b5b34SRafael Vanoni  * Free Software Foundation, Inc.,
19*b47b5b34SRafael Vanoni  * 51 Franklin Street, Fifth Floor,
20*b47b5b34SRafael Vanoni  * Boston, MA 02110-1301 USA
21*b47b5b34SRafael Vanoni  *
22*b47b5b34SRafael Vanoni  * Authors:
23*b47b5b34SRafael Vanoni  *      Arjan van de Ven <arjan@linux.intel.com>
24*b47b5b34SRafael Vanoni  *      Eric C Saxe <eric.saxe@sun.com>
25*b47b5b34SRafael Vanoni  *      Aubrey Li <aubrey.li@intel.com>
26*b47b5b34SRafael Vanoni  */
27*b47b5b34SRafael Vanoni 
28*b47b5b34SRafael Vanoni /*
29*b47b5b34SRafael Vanoni  * GPL Disclaimer
30*b47b5b34SRafael Vanoni  *
31*b47b5b34SRafael Vanoni  * For the avoidance of doubt, except that if any license choice other
32*b47b5b34SRafael Vanoni  * than GPL or LGPL is available it will apply instead, Sun elects to
33*b47b5b34SRafael Vanoni  * use only the General Public License version 2 (GPLv2) at this time
34*b47b5b34SRafael Vanoni  * for any software where a choice of GPL license versions is made
35*b47b5b34SRafael Vanoni  * available with the language indicating that GPLv2 or any later
36*b47b5b34SRafael Vanoni  * version may be used, or where a choice of which version of the GPL
37*b47b5b34SRafael Vanoni  * is applied is otherwise unspecified.
38*b47b5b34SRafael Vanoni  */
39*b47b5b34SRafael Vanoni 
40*b47b5b34SRafael Vanoni #include <unistd.h>
41*b47b5b34SRafael Vanoni #include <stdio.h>
42*b47b5b34SRafael Vanoni #include <stdlib.h>
43*b47b5b34SRafael Vanoni #include <string.h>
44*b47b5b34SRafael Vanoni #include "powertop.h"
45*b47b5b34SRafael Vanoni 
46*b47b5b34SRafael Vanoni struct suggestion;
47*b47b5b34SRafael Vanoni 
48*b47b5b34SRafael Vanoni struct suggestion {
49*b47b5b34SRafael Vanoni 	struct suggestion *next;
50*b47b5b34SRafael Vanoni 
51*b47b5b34SRafael Vanoni 	char 	*string;
52*b47b5b34SRafael Vanoni 	int	weight;
53*b47b5b34SRafael Vanoni 	char 	key;
54*b47b5b34SRafael Vanoni 	char 	*keystring;
55*b47b5b34SRafael Vanoni 
56*b47b5b34SRafael Vanoni 	suggestion_func *func;
57*b47b5b34SRafael Vanoni };
58*b47b5b34SRafael Vanoni 
59*b47b5b34SRafael Vanoni static struct suggestion 	*suggestions;
60*b47b5b34SRafael Vanoni static int 			total_weight;
61*b47b5b34SRafael Vanoni 
62*b47b5b34SRafael Vanoni static char 	previous[1024];
63*b47b5b34SRafael Vanoni 
64*b47b5b34SRafael Vanoni void
65*b47b5b34SRafael Vanoni reset_suggestions(void)
66*b47b5b34SRafael Vanoni {
67*b47b5b34SRafael Vanoni 	struct suggestion *ptr;
68*b47b5b34SRafael Vanoni 
69*b47b5b34SRafael Vanoni 	ptr = suggestions;
70*b47b5b34SRafael Vanoni 
71*b47b5b34SRafael Vanoni 	while (ptr) {
72*b47b5b34SRafael Vanoni 		struct suggestion *next;
73*b47b5b34SRafael Vanoni 
74*b47b5b34SRafael Vanoni 		next = ptr->next;
75*b47b5b34SRafael Vanoni 		free(ptr->string);
76*b47b5b34SRafael Vanoni 		free(ptr->keystring);
77*b47b5b34SRafael Vanoni 		free(ptr);
78*b47b5b34SRafael Vanoni 		ptr = next;
79*b47b5b34SRafael Vanoni 	}
80*b47b5b34SRafael Vanoni 
81*b47b5b34SRafael Vanoni 	suggestions = NULL;
82*b47b5b34SRafael Vanoni 	(void) strcpy(g_status_bar_slots[8], "");
83*b47b5b34SRafael Vanoni 
84*b47b5b34SRafael Vanoni 	g_suggestion_key 	= -1;
85*b47b5b34SRafael Vanoni 	g_suggestion_activate 	= NULL;
86*b47b5b34SRafael Vanoni 	total_weight 		= 0;
87*b47b5b34SRafael Vanoni }
88*b47b5b34SRafael Vanoni 
89*b47b5b34SRafael Vanoni void
90*b47b5b34SRafael Vanoni add_suggestion(char *text, int weight, char key, char *keystring,
91*b47b5b34SRafael Vanoni     suggestion_func *func)
92*b47b5b34SRafael Vanoni {
93*b47b5b34SRafael Vanoni 	struct suggestion *new;
94*b47b5b34SRafael Vanoni 
95*b47b5b34SRafael Vanoni 	if (!text)
96*b47b5b34SRafael Vanoni 		return;
97*b47b5b34SRafael Vanoni 
98*b47b5b34SRafael Vanoni 	new = malloc(sizeof (struct suggestion));
99*b47b5b34SRafael Vanoni 
100*b47b5b34SRafael Vanoni 	if (!new)
101*b47b5b34SRafael Vanoni 		return;
102*b47b5b34SRafael Vanoni 
103*b47b5b34SRafael Vanoni 	(void) memset(new, 0, sizeof (struct suggestion));
104*b47b5b34SRafael Vanoni 
105*b47b5b34SRafael Vanoni 	new->string = strdup(text);
106*b47b5b34SRafael Vanoni 	new->weight = weight;
107*b47b5b34SRafael Vanoni 	new->key = key;
108*b47b5b34SRafael Vanoni 
109*b47b5b34SRafael Vanoni 	if (keystring)
110*b47b5b34SRafael Vanoni 		new->keystring = strdup(keystring);
111*b47b5b34SRafael Vanoni 
112*b47b5b34SRafael Vanoni 	new->next 	= suggestions;
113*b47b5b34SRafael Vanoni 	new->func 	= func;
114*b47b5b34SRafael Vanoni 	suggestions 	= new;
115*b47b5b34SRafael Vanoni 	total_weight 	+= weight;
116*b47b5b34SRafael Vanoni }
117*b47b5b34SRafael Vanoni 
118*b47b5b34SRafael Vanoni void
119*b47b5b34SRafael Vanoni pick_suggestion(void)
120*b47b5b34SRafael Vanoni {
121*b47b5b34SRafael Vanoni 	int			weight, value, running = 0;
122*b47b5b34SRafael Vanoni 	struct suggestion 	*ptr;
123*b47b5b34SRafael Vanoni 
124*b47b5b34SRafael Vanoni 	(void) strcpy(g_status_bar_slots[8], "");
125*b47b5b34SRafael Vanoni 	g_suggestion_key 	= -1;
126*b47b5b34SRafael Vanoni 	g_suggestion_activate 	= NULL;
127*b47b5b34SRafael Vanoni 
128*b47b5b34SRafael Vanoni 	if (total_weight == 0 || suggestions == NULL) {
129*b47b5b34SRafael Vanoni 		show_suggestion("");
130*b47b5b34SRafael Vanoni 		return;
131*b47b5b34SRafael Vanoni 	}
132*b47b5b34SRafael Vanoni 
133*b47b5b34SRafael Vanoni 	weight = total_weight;
134*b47b5b34SRafael Vanoni 
135*b47b5b34SRafael Vanoni 	if (strlen(previous) && g_displaytime > 0.0)
136*b47b5b34SRafael Vanoni 		weight += 50;
137*b47b5b34SRafael Vanoni 
138*b47b5b34SRafael Vanoni 	value 	= rand() % weight;
139*b47b5b34SRafael Vanoni 	ptr 	= suggestions;
140*b47b5b34SRafael Vanoni 
141*b47b5b34SRafael Vanoni 	while (ptr) {
142*b47b5b34SRafael Vanoni 		running += ptr->weight;
143*b47b5b34SRafael Vanoni 
144*b47b5b34SRafael Vanoni 		if (strcmp(ptr->string, previous) == 0 && g_displaytime > 0.0)
145*b47b5b34SRafael Vanoni 			running += 50;
146*b47b5b34SRafael Vanoni 
147*b47b5b34SRafael Vanoni 		if (running > value) {
148*b47b5b34SRafael Vanoni 			if (ptr->keystring)
149*b47b5b34SRafael Vanoni 				(void) strncpy(g_status_bar_slots[8],
150*b47b5b34SRafael Vanoni 				    ptr->keystring, PTOP_BAR_LENGTH);
151*b47b5b34SRafael Vanoni 
152*b47b5b34SRafael Vanoni 			g_suggestion_key 	= ptr->key;
153*b47b5b34SRafael Vanoni 			g_suggestion_activate 	= ptr->func;
154*b47b5b34SRafael Vanoni 
155*b47b5b34SRafael Vanoni 			show_suggestion(ptr->string);
156*b47b5b34SRafael Vanoni 
157*b47b5b34SRafael Vanoni 			if (strcmp(ptr->string, previous)) {
158*b47b5b34SRafael Vanoni 				g_displaytime = 30.0;
159*b47b5b34SRafael Vanoni 				(void) strcpy(previous, ptr->string);
160*b47b5b34SRafael Vanoni 			}
161*b47b5b34SRafael Vanoni 			return;
162*b47b5b34SRafael Vanoni 		}
163*b47b5b34SRafael Vanoni 		ptr = ptr->next;
164*b47b5b34SRafael Vanoni 	}
165*b47b5b34SRafael Vanoni 
166*b47b5b34SRafael Vanoni 	show_suggestion("");
167*b47b5b34SRafael Vanoni 	(void) memset(previous, 0, sizeof (previous));
168*b47b5b34SRafael Vanoni 	g_displaytime = -1.0;
169*b47b5b34SRafael Vanoni }
170*b47b5b34SRafael Vanoni 
171*b47b5b34SRafael Vanoni void
172*b47b5b34SRafael Vanoni print_all_suggestions(void)
173*b47b5b34SRafael Vanoni {
174*b47b5b34SRafael Vanoni 	struct suggestion *ptr;
175*b47b5b34SRafael Vanoni 
176*b47b5b34SRafael Vanoni 	for (ptr = suggestions; ptr; ptr = ptr->next)
177*b47b5b34SRafael Vanoni 		(void) printf("\n%s\n", ptr->string);
178*b47b5b34SRafael Vanoni }
179