Use the mainloop we added in the previous patch. Some reorg is needed with the functions, they are moved up and down to prevent forward declarations.
Signed-off-by: Daniel Lezcano daniel.lezcano@linaro.org --- display.c | 265 ++++++++++++++++++++++++++++++--------------------------- display.h | 3 +- mainloop.c | 2 +- mainloop.h | 2 +- powerdebug.c | 43 ++-------- 5 files changed, 149 insertions(+), 166 deletions(-)
diff --git a/display.c b/display.c index 257e540..45446cb 100644 --- a/display.c +++ b/display.c @@ -18,6 +18,7 @@ #include <stdlib.h> #include <ncurses.h> #include "powerdebug.h" +#include "mainloop.h" #include "regulator.h" #include "display.h"
@@ -106,130 +107,14 @@ static int show_header_footer(int win) return 0; }
-int display_init(int wdefault) +int display_refresh(int win) { - int i; - size_t array_size = sizeof(windata) / sizeof(windata[0]); - - current_win = wdefault; - - if (!initscr()) - return -1; + /* we are trying to refresh a window which is not showed */ + if (win != current_win) + return 0;
- start_color(); - use_default_colors(); - - keypad(stdscr, TRUE); - noecho(); - cbreak(); - curs_set(0); - nonl(); - - if (init_pair(PT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK) || - init_pair(PT_COLOR_ERROR, COLOR_BLACK, COLOR_RED) || - init_pair(PT_COLOR_HEADER_BAR, COLOR_WHITE, COLOR_BLACK) || - init_pair(PT_COLOR_YELLOW, COLOR_WHITE, COLOR_YELLOW) || - init_pair(PT_COLOR_GREEN, COLOR_WHITE, COLOR_GREEN) || - init_pair(PT_COLOR_BRIGHT, COLOR_WHITE, COLOR_BLACK) || - init_pair(PT_COLOR_BLUE, COLOR_WHITE, COLOR_BLUE) || - init_pair(PT_COLOR_RED, COLOR_WHITE, COLOR_RED)) - return -1; - - if (atexit(display_fini)) - return -1; - - getmaxyx(stdscr, maxy, maxx); - - for (i = 0; i < array_size; i++) { - - windata[i].win = subwin(stdscr, maxy - 2, maxx, 1, 0); - if (!windata[i].win) - return -1; - - windata[i].pad = newpad(maxrows, maxx); - if (!windata[i].pad) - return -1; - - } - - header_win = subwin(stdscr, 1, maxx, 0, 0); - if (!header_win) - return -1; - - footer_win = subwin(stdscr, 1, maxx, maxy-1, 0); - if (!footer_win) - return -1; - - return show_header_footer(wdefault); -} - -void print_regulator_header(void) -{ - WINDOW *regulator_win = windata[REGULATOR].win; - - werase(regulator_win); - wattron(regulator_win, A_BOLD); - print(regulator_win, 0, 0, "Name"); - print(regulator_win, 12, 0, "Status"); - print(regulator_win, 24, 0, "State"); - print(regulator_win, 36, 0, "Type"); - print(regulator_win, 48, 0, "Users"); - print(regulator_win, 60, 0, "Microvolts"); - print(regulator_win, 72, 0, "Min u-volts"); - print(regulator_win, 84, 0, "Max u-volts"); - wattroff(regulator_win, A_BOLD); - wrefresh(regulator_win); - - show_header_footer(REGULATOR); -} - -void print_clock_header(void) -{ - WINDOW *clock_win = windata[CLOCK].win; - - werase(clock_win); - wattron(clock_win, A_BOLD); - print(clock_win, 0, 0, "Name"); - print(clock_win, 56, 0, "Flags"); - print(clock_win, 75, 0, "Rate"); - print(clock_win, 88, 0, "Usecount"); - print(clock_win, 98, 0, "Children"); - wattroff(clock_win, A_BOLD); - wrefresh(clock_win); - - show_header_footer(CLOCK); -} - -void print_sensor_header(void) -{ - WINDOW *sensor_win = windata[SENSOR].win; - - werase(sensor_win); - wattron(sensor_win, A_BOLD); - print(sensor_win, 0, 0, "Name"); - print(sensor_win, 36, 0, "Value"); - wattroff(sensor_win, A_BOLD); - wrefresh(sensor_win); - - show_header_footer(SENSOR); -} - -int display_register(int win, struct display_ops *ops) -{ - size_t array_size = sizeof(windata) / sizeof(windata[0]); - - if (win < 0 || win >= array_size) - return -1; - - windata[win].ops = ops; - - return 0; -} - -int display_refresh(void) -{ - if (windata[current_win].ops && windata[current_win].ops->display) - return windata[current_win].ops->display(); + if (windata[win].ops && windata[win].ops->display) + return windata[win].ops->display();
return 0; } @@ -378,9 +263,8 @@ int display_print_line(int win, int line, char *str, int bold, void *data) return 0; }
-int display_keystroke(void *data) +static int display_keystroke(int fd, void *data) { - int *tick = data; int keystroke = getch();
switch (keystroke) { @@ -414,10 +298,139 @@ int display_keystroke(void *data)
case 'r': case 'R': - display_refresh(); - *tick = 3; + /* refresh will be done after */ break; + default: + return 0; + } + + display_refresh(current_win); + + return 0; +} + +int display_init(int wdefault) +{ + int i; + size_t array_size = sizeof(windata) / sizeof(windata[0]); + + current_win = wdefault; + + if (mainloop_add(0, display_keystroke, NULL)) + return -1; + + if (!initscr()) + return -1; + + start_color(); + use_default_colors(); + + keypad(stdscr, TRUE); + noecho(); + cbreak(); + curs_set(0); + nonl(); + + if (init_pair(PT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK) || + init_pair(PT_COLOR_ERROR, COLOR_BLACK, COLOR_RED) || + init_pair(PT_COLOR_HEADER_BAR, COLOR_WHITE, COLOR_BLACK) || + init_pair(PT_COLOR_YELLOW, COLOR_WHITE, COLOR_YELLOW) || + init_pair(PT_COLOR_GREEN, COLOR_WHITE, COLOR_GREEN) || + init_pair(PT_COLOR_BRIGHT, COLOR_WHITE, COLOR_BLACK) || + init_pair(PT_COLOR_BLUE, COLOR_WHITE, COLOR_BLUE) || + init_pair(PT_COLOR_RED, COLOR_WHITE, COLOR_RED)) + return -1; + + if (atexit(display_fini)) + return -1; + + getmaxyx(stdscr, maxy, maxx); + + for (i = 0; i < array_size; i++) { + + windata[i].win = subwin(stdscr, maxy - 2, maxx, 1, 0); + if (!windata[i].win) + return -1; + + windata[i].pad = newpad(maxrows, maxx); + if (!windata[i].pad) + return -1; + }
+ header_win = subwin(stdscr, 1, maxx, 0, 0); + if (!header_win) + return -1; + + footer_win = subwin(stdscr, 1, maxx, maxy-1, 0); + if (!footer_win) + return -1; + + if (show_header_footer(wdefault)) + return -1; + + return display_refresh(wdefault); +} + +void print_regulator_header(void) +{ + WINDOW *regulator_win = windata[REGULATOR].win; + + werase(regulator_win); + wattron(regulator_win, A_BOLD); + print(regulator_win, 0, 0, "Name"); + print(regulator_win, 12, 0, "Status"); + print(regulator_win, 24, 0, "State"); + print(regulator_win, 36, 0, "Type"); + print(regulator_win, 48, 0, "Users"); + print(regulator_win, 60, 0, "Microvolts"); + print(regulator_win, 72, 0, "Min u-volts"); + print(regulator_win, 84, 0, "Max u-volts"); + wattroff(regulator_win, A_BOLD); + wrefresh(regulator_win); + + show_header_footer(REGULATOR); +} + +void print_clock_header(void) +{ + WINDOW *clock_win = windata[CLOCK].win; + + werase(clock_win); + wattron(clock_win, A_BOLD); + print(clock_win, 0, 0, "Name"); + print(clock_win, 56, 0, "Flags"); + print(clock_win, 75, 0, "Rate"); + print(clock_win, 88, 0, "Usecount"); + print(clock_win, 98, 0, "Children"); + wattroff(clock_win, A_BOLD); + wrefresh(clock_win); + + show_header_footer(CLOCK); +} + +void print_sensor_header(void) +{ + WINDOW *sensor_win = windata[SENSOR].win; + + werase(sensor_win); + wattron(sensor_win, A_BOLD); + print(sensor_win, 0, 0, "Name"); + print(sensor_win, 36, 0, "Value"); + wattroff(sensor_win, A_BOLD); + wrefresh(sensor_win); + + show_header_footer(SENSOR); +} + +int display_register(int win, struct display_ops *ops) +{ + size_t array_size = sizeof(windata) / sizeof(windata[0]); + + if (win < 0 || win >= array_size) + return -1; + + windata[win].ops = ops; + return 0; } diff --git a/display.h b/display.h index f354195..749d8a3 100644 --- a/display.h +++ b/display.h @@ -29,8 +29,7 @@ extern void *display_get_row_data(int window);
extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); -extern int display_refresh(void); -extern int display_keystroke(void *data); +extern int display_refresh(int win);
/* FIXME */ extern void print_sensor_header(void); diff --git a/mainloop.c b/mainloop.c index d63d703..02dda98 100644 --- a/mainloop.c +++ b/mainloop.c @@ -32,7 +32,7 @@ struct mainloop_data **mds;
#define MAX_EVENTS 10
-int _mainloop(unsigned int timeout) +int mainloop(unsigned int timeout) { int i, nfds; struct epoll_event events[MAX_EVENTS]; diff --git a/mainloop.h b/mainloop.h index 3b4c253..cf03bbb 100644 --- a/mainloop.h +++ b/mainloop.h @@ -15,7 +15,7 @@
typedef int (*mainloop_callback_t)(int fd, void *data);
-extern int _mainloop(unsigned int timeout); +extern int mainloop(unsigned int timeout); extern int mainloop_add(int fd, mainloop_callback_t cb, void *data); extern int mainloop_del(int fd); extern int mainloop_init(void); diff --git a/powerdebug.c b/powerdebug.c index 065fa31..b4575c4 100644 --- a/powerdebug.c +++ b/powerdebug.c @@ -24,6 +24,7 @@ #include "display.h" #include "clocks.h" #include "sensor.h" +#include "mainloop.h" #include "powerdebug.h"
void usage(void) @@ -157,38 +158,6 @@ int getoptions(int argc, char *argv[], struct powerdebug_options *options) return 0; }
-int mainloop(struct powerdebug_options *options) -{ - while (1) { - int ret; - struct timeval tval; - fd_set readfds; - - display_refresh(); - - FD_ZERO(&readfds); - FD_SET(0, &readfds); - tval.tv_sec = options->ticktime; - tval.tv_usec = (options->ticktime - tval.tv_sec) * 1000000; - - again: - ret = select(1, &readfds, NULL, NULL, &tval); - if (!ret) - continue; - - if (ret < 0) { - if (errno == EINTR) - goto again; - break; - } - - if (display_keystroke(&options->ticktime)) - break; - } - - return 0; -} - static int powerdebug_dump(struct powerdebug_options *options) { if (options->regulators) @@ -210,10 +179,7 @@ static int powerdebug_display(struct powerdebug_options *options) return -1; }
- if (display_refresh()) - return -1; - - if (mainloop(options)) + if (mainloop(options->ticktime * 1000)) return -1;
return 0; @@ -248,6 +214,11 @@ int main(int argc, char **argv) return 1; }
+ if (mainloop_init()) { + fprintf(stderr, "failed to initialize the mainloop\n"); + return 1; + } + if (regulator_init()) { printf("not enough memory to allocate regulators info\n"); options->regulators = false;