17a192d395ce5d7e5945afa684146d5b0abc53480mbligh/*
27a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Copyright 2007, Intel Corporation
37a192d395ce5d7e5945afa684146d5b0abc53480mbligh *
47a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This file is part of PowerTOP
57a192d395ce5d7e5945afa684146d5b0abc53480mbligh *
67a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program file is free software; you can redistribute it and/or modify it
77a192d395ce5d7e5945afa684146d5b0abc53480mbligh * under the terms of the GNU General Public License as published by the
87a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation; version 2 of the License.
97a192d395ce5d7e5945afa684146d5b0abc53480mbligh *
107a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program is distributed in the hope that it will be useful, but WITHOUT
117a192d395ce5d7e5945afa684146d5b0abc53480mbligh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
127a192d395ce5d7e5945afa684146d5b0abc53480mbligh * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
137a192d395ce5d7e5945afa684146d5b0abc53480mbligh * for more details.
147a192d395ce5d7e5945afa684146d5b0abc53480mbligh *
157a192d395ce5d7e5945afa684146d5b0abc53480mbligh * You should have received a copy of the GNU General Public License
167a192d395ce5d7e5945afa684146d5b0abc53480mbligh * along with this program in a file named COPYING; if not, write to the
177a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation, Inc.,
187a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 51 Franklin Street, Fifth Floor,
197a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Boston, MA 02110-1301 USA
207a192d395ce5d7e5945afa684146d5b0abc53480mbligh *
217a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Authors:
227a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 	Arjan van de Ven <arjan@linux.intel.com>
237a192d395ce5d7e5945afa684146d5b0abc53480mbligh */
247a192d395ce5d7e5945afa684146d5b0abc53480mbligh
257a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <unistd.h>
267a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdio.h>
277a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdlib.h>
287a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <string.h>
297a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdint.h>
307a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <sys/types.h>
317a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <dirent.h>
327a192d395ce5d7e5945afa684146d5b0abc53480mbligh
337a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include "powertop.h"
347a192d395ce5d7e5945afa684146d5b0abc53480mbligh
357a192d395ce5d7e5945afa684146d5b0abc53480mbligh
367a192d395ce5d7e5945afa684146d5b0abc53480mbligh
377a192d395ce5d7e5945afa684146d5b0abc53480mblighchar suggestion_key;
387a192d395ce5d7e5945afa684146d5b0abc53480mblighsuggestion_func *suggestion_activate;
397a192d395ce5d7e5945afa684146d5b0abc53480mbligh
407a192d395ce5d7e5945afa684146d5b0abc53480mblighstruct suggestion;
417a192d395ce5d7e5945afa684146d5b0abc53480mbligh
427a192d395ce5d7e5945afa684146d5b0abc53480mblighstruct suggestion {
437a192d395ce5d7e5945afa684146d5b0abc53480mbligh	struct suggestion *next;
447a192d395ce5d7e5945afa684146d5b0abc53480mbligh
457a192d395ce5d7e5945afa684146d5b0abc53480mbligh	char *string;
467a192d395ce5d7e5945afa684146d5b0abc53480mbligh	int weight;
477a192d395ce5d7e5945afa684146d5b0abc53480mbligh
487a192d395ce5d7e5945afa684146d5b0abc53480mbligh	char key;
497a192d395ce5d7e5945afa684146d5b0abc53480mbligh	char *keystring;
507a192d395ce5d7e5945afa684146d5b0abc53480mbligh
517a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestion_func *func;
527a192d395ce5d7e5945afa684146d5b0abc53480mbligh};
537a192d395ce5d7e5945afa684146d5b0abc53480mbligh
547a192d395ce5d7e5945afa684146d5b0abc53480mbligh
557a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic struct suggestion *suggestions;
567a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic int total_weight;
577a192d395ce5d7e5945afa684146d5b0abc53480mbligh
587a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic char previous[1024];
597a192d395ce5d7e5945afa684146d5b0abc53480mbligh
607a192d395ce5d7e5945afa684146d5b0abc53480mbligh
617a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid reset_suggestions(void)
627a192d395ce5d7e5945afa684146d5b0abc53480mbligh{
637a192d395ce5d7e5945afa684146d5b0abc53480mbligh	struct suggestion *ptr;
647a192d395ce5d7e5945afa684146d5b0abc53480mbligh	ptr = suggestions;
657a192d395ce5d7e5945afa684146d5b0abc53480mbligh	while (ptr) {
667a192d395ce5d7e5945afa684146d5b0abc53480mbligh		struct suggestion *next;
677a192d395ce5d7e5945afa684146d5b0abc53480mbligh		next = ptr->next;
687a192d395ce5d7e5945afa684146d5b0abc53480mbligh		free(ptr->string);
697a192d395ce5d7e5945afa684146d5b0abc53480mbligh		free(ptr->keystring);
707a192d395ce5d7e5945afa684146d5b0abc53480mbligh		free(ptr);
717a192d395ce5d7e5945afa684146d5b0abc53480mbligh		ptr = next;
727a192d395ce5d7e5945afa684146d5b0abc53480mbligh	}
737a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestions = NULL;
747a192d395ce5d7e5945afa684146d5b0abc53480mbligh	strcpy(status_bar_slots[8],"");
757a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestion_key = 255;
767a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestion_activate = NULL;
777a192d395ce5d7e5945afa684146d5b0abc53480mbligh	total_weight = 0;
787a192d395ce5d7e5945afa684146d5b0abc53480mbligh}
797a192d395ce5d7e5945afa684146d5b0abc53480mbligh
807a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid add_suggestion(char *text, int weight, char key, char *keystring, suggestion_func *func)
817a192d395ce5d7e5945afa684146d5b0abc53480mbligh{
827a192d395ce5d7e5945afa684146d5b0abc53480mbligh	struct suggestion *new;
837a192d395ce5d7e5945afa684146d5b0abc53480mbligh
847a192d395ce5d7e5945afa684146d5b0abc53480mbligh	if (!text)
857a192d395ce5d7e5945afa684146d5b0abc53480mbligh		return;
867a192d395ce5d7e5945afa684146d5b0abc53480mbligh
877a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new = malloc(sizeof(struct suggestion));
887a192d395ce5d7e5945afa684146d5b0abc53480mbligh	if (!new)
897a192d395ce5d7e5945afa684146d5b0abc53480mbligh		return;
907a192d395ce5d7e5945afa684146d5b0abc53480mbligh	memset(new, 0, sizeof(struct suggestion));
917a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new->string = strdup(text);
927a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new->weight = weight;
937a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new->key = key;
947a192d395ce5d7e5945afa684146d5b0abc53480mbligh	if (keystring)
957a192d395ce5d7e5945afa684146d5b0abc53480mbligh		new->keystring = strdup(keystring);
967a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new->next = suggestions;
977a192d395ce5d7e5945afa684146d5b0abc53480mbligh	new->func = func;
987a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestions = new;
997a192d395ce5d7e5945afa684146d5b0abc53480mbligh	total_weight += weight;
1007a192d395ce5d7e5945afa684146d5b0abc53480mbligh}
1017a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1027a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid pick_suggestion(void)
1037a192d395ce5d7e5945afa684146d5b0abc53480mbligh{
1047a192d395ce5d7e5945afa684146d5b0abc53480mbligh	int value, running = 0;
1057a192d395ce5d7e5945afa684146d5b0abc53480mbligh	struct suggestion *ptr;
1067a192d395ce5d7e5945afa684146d5b0abc53480mbligh	int weight;
1077a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1087a192d395ce5d7e5945afa684146d5b0abc53480mbligh	strcpy(status_bar_slots[8],"");
1097a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestion_key = 255;
1107a192d395ce5d7e5945afa684146d5b0abc53480mbligh	suggestion_activate = NULL;
1117a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1127a192d395ce5d7e5945afa684146d5b0abc53480mbligh	if (total_weight==0 || suggestions==NULL) {
1137a192d395ce5d7e5945afa684146d5b0abc53480mbligh		/* zero suggestions */
1147a192d395ce5d7e5945afa684146d5b0abc53480mbligh		show_suggestion("");
1157a192d395ce5d7e5945afa684146d5b0abc53480mbligh		return;
1167a192d395ce5d7e5945afa684146d5b0abc53480mbligh	}
1177a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1187a192d395ce5d7e5945afa684146d5b0abc53480mbligh	weight = total_weight;
1197a192d395ce5d7e5945afa684146d5b0abc53480mbligh	if (strlen(previous) && displaytime > 0.0)
1207a192d395ce5d7e5945afa684146d5b0abc53480mbligh		weight+=50;
1217a192d395ce5d7e5945afa684146d5b0abc53480mbligh	value = rand() % weight;
1227a192d395ce5d7e5945afa684146d5b0abc53480mbligh	ptr = suggestions;
1237a192d395ce5d7e5945afa684146d5b0abc53480mbligh	while (ptr) {
1247a192d395ce5d7e5945afa684146d5b0abc53480mbligh		running += ptr->weight;
1257a192d395ce5d7e5945afa684146d5b0abc53480mbligh		if (strcmp(ptr->string, previous)==0 && displaytime > 0.0)
1267a192d395ce5d7e5945afa684146d5b0abc53480mbligh			running += 50;
1277a192d395ce5d7e5945afa684146d5b0abc53480mbligh		if (running > value) {
1287a192d395ce5d7e5945afa684146d5b0abc53480mbligh			if (ptr->keystring)
1297a192d395ce5d7e5945afa684146d5b0abc53480mbligh				strncpy(status_bar_slots[8],ptr->keystring, 40);
1307a192d395ce5d7e5945afa684146d5b0abc53480mbligh			suggestion_key = ptr->key;
1317a192d395ce5d7e5945afa684146d5b0abc53480mbligh			suggestion_activate = ptr->func;
1327a192d395ce5d7e5945afa684146d5b0abc53480mbligh			show_suggestion(ptr->string);
1337a192d395ce5d7e5945afa684146d5b0abc53480mbligh			if (strcmp(ptr->string, previous)) {
1347a192d395ce5d7e5945afa684146d5b0abc53480mbligh				displaytime = 30.0;
1357a192d395ce5d7e5945afa684146d5b0abc53480mbligh				strcpy(previous, ptr->string);
1367a192d395ce5d7e5945afa684146d5b0abc53480mbligh			}
1377a192d395ce5d7e5945afa684146d5b0abc53480mbligh			return;
1387a192d395ce5d7e5945afa684146d5b0abc53480mbligh		}
1397a192d395ce5d7e5945afa684146d5b0abc53480mbligh		ptr = ptr->next;
1407a192d395ce5d7e5945afa684146d5b0abc53480mbligh	}
1417a192d395ce5d7e5945afa684146d5b0abc53480mbligh	show_suggestion("");
1427a192d395ce5d7e5945afa684146d5b0abc53480mbligh	memset(previous, 0, sizeof(previous));
1437a192d395ce5d7e5945afa684146d5b0abc53480mbligh	displaytime = -1.0;
1447a192d395ce5d7e5945afa684146d5b0abc53480mbligh}
1457a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1467a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid print_all_suggestions(void)
1477a192d395ce5d7e5945afa684146d5b0abc53480mbligh{
1487a192d395ce5d7e5945afa684146d5b0abc53480mbligh	struct suggestion *ptr;
1497a192d395ce5d7e5945afa684146d5b0abc53480mbligh
1507a192d395ce5d7e5945afa684146d5b0abc53480mbligh	for (ptr = suggestions; ptr; ptr = ptr->next)
1517a192d395ce5d7e5945afa684146d5b0abc53480mbligh		printf("\n%s\n", ptr->string);
1527a192d395ce5d7e5945afa684146d5b0abc53480mbligh}
153