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