/******************************************************************************* * Copyright (C) 2010, Linaro Limited. * * This file is part of PowerDebug. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Amit Arora (IBM Corporation) * - initial API and implementation *******************************************************************************/ #include #include "powerdebug.h" int dump; int highlighted_row; int selectedwindow = -1; double ticktime = 10.0; /* in seconds */ char *win_names[TOTAL_FEATURE_WINS] = { "Clocks", "Regulators", "Sensors" }; void usage(void) { printf("Usage: powerdebug [OPTIONS]\n"); printf("\n"); printf("powerdebug -d [ -r ] [ -s ] [ -c [ -p ] ] " "[ -v ]\n"); printf("powerdebug [ -r | -s | -c ]\n"); printf(" -r, --regulator Show regulator information\n"); printf(" -s, --sensor Show sensor information\n"); printf(" -c, --clock Show clock information\n"); printf(" -p, --findparents Show all parents for a particular" " clock\n"); printf(" -t, --time Set ticktime in seconds (eg. 10.0)\n"); printf(" -d, --dump Dump information once (no refresh)\n"); printf(" -v, --verbose Verbose mode (use with -r and/or" " -s)\n"); printf(" -V, --version Show Version\n"); printf(" -h, --help Help\n"); exit(0); } void version() { printf("powerdebug version %s\n", VERSION); exit(0); } int main(int argc, char **argv) { int c, i; int firsttime[TOTAL_FEATURE_WINS]; int enter_hit = 0, verbose = 0, findparent_ncurses = 0, refreshwin = 0; int regulators = 0, sensors = 0, clocks = 0, findparent = 0; char clkarg[64], clkname_str[64]; for (i = 0; i < TOTAL_FEATURE_WINS; i++) firsttime[i] = 1; /* * Options: * -r, --regulator : regulator * -s, --sensor : sensors * -c, --clock : clocks * -p, --findparents : clockname whose parents have to be found * -t, --time : ticktime * -d, --dump : dump * -v, --verbose : verbose * -V, --version : version * -h, --help : help * no option / default : show usage! */ while (1) { int optindex = 0; static struct option long_options[] = { {"regulator", 0, 0, 'r'}, {"sensor", 0, 0, 's'}, {"clock", 0, 0, 'c'}, {"findparents", 1, 0, 'p'}, {"time", 1, 0, 't'}, {"dump", 0, 0, 'd'}, {"verbose", 0, 0, 'v'}, {"version", 0, 0, 'V'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, "rscp:t:dvVh", long_options, &optindex); if (c == -1) break; switch (c) { case 'r': regulators = 1; selectedwindow = REGULATOR; break; case 's': sensors = 1; selectedwindow = SENSOR; break; case 'c': clocks = 1; selectedwindow = CLOCK; break; case 'p': findparent = 1; strcpy(clkarg, optarg); break; case 't': ticktime = strtod(optarg, NULL); break; case 'd': dump = 1; break; case 'v': verbose = 1; break; case 'V': version(); break; case 'h': usage(); break; case '?': fprintf (stderr, "%s: Unknown option %c'.\n", argv[0], optopt); exit(1); default: usage(); break; } } if (dump && !(regulators || clocks || sensors)) { //fprintf(stderr, "Dump mode (-d) supported only with -c, -r " // "or -s ..\n"); //usage(); // By Default lets show everything we have! regulators = clocks = sensors = 1; } if (findparent && (!clocks || !dump)) { fprintf(stderr, "-p option passed without -c and -d." " Exiting...\n"); usage(); } if (!dump && selectedwindow == -1) selectedwindow = CLOCK; init_regulator_ds(); while (1) { int key = 0; struct timeval tval; fd_set readfds; if (!dump) { if (firsttime[0]) init_curses(); create_windows(); show_header(); } if (regulators || selectedwindow == REGULATOR) { read_regulator_info(); if (!dump) { create_selectedwindow(); show_regulator_info(verbose); } else print_regulator_info(verbose); } if (clocks || selectedwindow == CLOCK) { int ret = 0; if (firsttime[CLOCK]) { ret = init_clock_details(); if (!ret) firsttime[CLOCK] = 0; strcpy(clkname_str, ""); } if (!ret && !dump) { int hrow; create_selectedwindow(); if (!findparent_ncurses) { int command = 0; if (enter_hit) command = CLOCK_SELECTED; if (refreshwin) command = REFRESH_WINDOW; hrow = read_and_print_clock_info( verbose, highlighted_row, command); highlighted_row = hrow; enter_hit = 0; } else find_parents_for_clock(clkname_str, enter_hit); } if (!ret && dump) { if (findparent) read_and_dump_clock_info_one(clkarg); else read_and_dump_clock_info(verbose); } } if (sensors || selectedwindow == SENSOR) { if (!dump) { create_selectedwindow(); print_sensor_header(); } else read_and_print_sensor_info(verbose); } if (dump) break; FD_ZERO(&readfds); FD_SET(0, &readfds); tval.tv_sec = ticktime; tval.tv_usec = (ticktime - tval.tv_sec) * 1000000; key = select(1, &readfds, NULL, NULL, &tval); if (key) { char keychar; int keystroke = getch(); int oldselectedwin = selectedwindow; if (keystroke == EOF) exit(0); if (keystroke == KEY_RIGHT || keystroke == 9) selectedwindow++; if (keystroke == KEY_LEFT || keystroke == 353) selectedwindow--; if (selectedwindow >= TOTAL_FEATURE_WINS) selectedwindow = 0; if (selectedwindow < 0) selectedwindow = TOTAL_FEATURE_WINS - 1; if (selectedwindow == CLOCK) { if (keystroke == KEY_DOWN) highlighted_row++; if (keystroke == KEY_UP && highlighted_row > 0) highlighted_row--; if (keystroke == 47) findparent_ncurses = 1; if ((keystroke == 27 || oldselectedwin != selectedwindow) && findparent_ncurses) { findparent_ncurses = 0; clkname_str[0] = '\0'; } if (findparent_ncurses && keystroke != 13) { int len = strlen(clkname_str); char str[2]; if (keystroke == 263) { if (len > 0) len--; clkname_str[len] = '\0'; } else { if (strlen(clkname_str) || keystroke != '/') { str[0] = keystroke; str[1] = '\0'; if (len < 63) strcat(clkname_str, str); } } } } keychar = toupper(keystroke); //#define DEBUG #ifdef DEBUG killall_windows(1); fini_curses(); printf("key entered %d:%c\n", keystroke, keychar); exit(1); #endif if (keystroke == 13) enter_hit = 1; if (keychar == 'Q' && !findparent_ncurses) exit(0); if (keychar == 'R') { refreshwin = 1; ticktime = 3; } else refreshwin = 0; } } exit(0); }