From ccf2ea914f91ed510e98e7e6eb3cba09778c35e1 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Tue, 12 Jul 2011 00:33:08 +1000 Subject: [PATCH] Convert the log and status portions of the screen to two separate ncurses windows for simpler cleaner output. --- main.c | 108 +++++++++++++++++++++++++-------------------------------- 1 file changed, 47 insertions(+), 61 deletions(-) diff --git a/main.c b/main.c index 1cfc7fce..977288dc 100644 --- a/main.c +++ b/main.c @@ -518,7 +518,7 @@ static inline int cpu_from_thr_id(int thr_id) return (thr_id - gpu_threads) % num_processors; } -static WINDOW * mainwin; +static WINDOW *mainwin, *statuswin, *logwin; static double total_secs = 0.1; static char statusline[256]; static int cpucursor, gpucursor, logstart, logcursor; @@ -532,79 +532,63 @@ static inline void print_status(int thr_id) if (unlikely(!curses_active)) return; - move(2,0); - printw("Totals: %s", statusline); - clrtoeol(); + wmove(statuswin, 0, 0); + wattron(statuswin, A_BOLD); + wprintw(statuswin, PROGRAM_NAME " version " VERSION); + wattroff(statuswin, A_BOLD); + wmove(statuswin, 1, 0); + whline(statuswin, '-', 80); + wmove(statuswin, 2,0); + wprintw(statuswin, "Totals: %s", statusline); + wclrtoeol(statuswin); + wmove(statuswin, 3, 0); + whline(statuswin, '-', 80); + wmove(statuswin, logstart - 1, 0); + whline(statuswin, '-', 80); if (thr_id >= 0 && thr_id < gpu_threads) { int gpu = gpu_from_thr_id(thr_id); struct cgpu_info *cgpu = &gpus[gpu]; - move(gpucursor + gpu, 0); - printw("GPU %d: [%.1f Mh/s] [Q:%d A:%d R:%d HW:%d E:%.0f%% U:%.2f/m] ", + wmove(statuswin, gpucursor + gpu, 0); + wprintw(statuswin, "GPU %d: [%.1f Mh/s] [Q:%d A:%d R:%d HW:%d E:%.0f%% U:%.2f/m]", gpu, cgpu->total_mhashes / total_secs, cgpu->getworks, cgpu->accepted, cgpu->rejected, cgpu->hw_errors, cgpu->efficiency, cgpu->utility); - clrtoeol(); + wclrtoeol(statuswin); } else if (thr_id >= gpu_threads) { int cpu = cpu_from_thr_id(thr_id); struct cgpu_info *cgpu = &cpus[cpu]; - move(cpucursor + cpu, 0); - printw("CPU %d: [%.1f Mh/s] [Q:%d A:%d R:%d HW:%d E:%.0f%% U:%.2f/m]", + wmove(statuswin, cpucursor + cpu, 0); + wprintw(statuswin, "CPU %d: [%.1f Mh/s] [Q:%d A:%d R:%d HW:%d E:%.0f%% U:%.2f/m]", cpu, cgpu->total_mhashes / total_secs, cgpu->getworks, cgpu->accepted, cgpu->rejected, cgpu->hw_errors, cgpu->efficiency, cgpu->utility); - clrtoeol(); + wclrtoeol(statuswin); } - move(logcursor, 0); - refresh(); -} - -static void refresh_display(void) -{ - int i, x; - - if (unlikely(!curses_active)) - return; - - move(0,0); - attron(A_BOLD); - printw(PROGRAM_NAME " version " VERSION); - attroff(A_BOLD); - clrtoeol(); - move(1, 0); - clrtoeol(); - hline('-', 80); - move(3, 0); - clrtoeol(); - hline('-', 80); - move(logstart, 0); - clrtoeol(); - hline('-', 80); - - for (i = 0; i < mining_threads; i++) - print_status(i); - - move(logcursor, 0); - redrawwin(mainwin); + wrefresh(statuswin); } void log_curses(const char *f, va_list ap) { - int x; + int x, y, logx, logy; if (unlikely(!curses_active)) return; - /* Scroll log output downwards */ - getmaxyx(mainwin, logcursor, x); - move(--logcursor, 0); - vw_printw(mainwin, f, ap); - clrtoeol(); - - refresh_display(); + getmaxyx(mainwin, y, x); + getmaxyx(logwin, logy, logx); + y -= logcursor; + /* Detect screen size change */ + if (x != logx || y != logy) { + wresize(logwin, y, x); + redrawwin(logwin); + redrawwin(statuswin); + } + vw_printw(logwin, f, ap); + wrefresh(logwin); } static bool submit_fail = false; @@ -1736,7 +1720,7 @@ static void *wakeup_thread(void *userdata) int main (int argc, char *argv[]) { struct thr_info *thr; - unsigned int i, j = 0; + unsigned int i, j = 0, x, y; char name[32]; if (unlikely(pthread_mutex_init(&hash_lock, NULL))) @@ -1804,7 +1788,7 @@ int main (int argc, char *argv[]) mining_threads = opt_n_threads + gpu_threads; gpucursor = logcursor; cpucursor = gpucursor + nDevs; - logstart = cpucursor + (opt_n_threads ? num_processors : 0); + logstart = cpucursor + (opt_n_threads ? num_processors : 0) + 1; logcursor = logstart + 1; if (!rpc_userpass) { @@ -1982,16 +1966,17 @@ int main (int argc, char *argv[]) pthread_mutex_unlock(&hash_lock); /* Set up the ncurses interface */ - if ((mainwin = initscr()) == NULL) { - applog(LOG_ERR, "Failed to initscr"); - return 1; - } - idlok(mainwin, true); - scrollok(mainwin, true); + mainwin = initscr(); + statuswin = newwin(logstart, 80, 0, 0); + getmaxyx(mainwin, y, x); + logwin = newwin(y - logcursor, 0, logcursor, 0); + idlok(logwin, true); + scrollok(logwin, true); + leaveok(logwin, true); + leaveok(statuswin, true); curses_active = true; - getmaxyx(mainwin, logcursor, i); - move(logcursor, 0); - refresh_display(); + for (i = 0; i < mining_threads; i++) + print_status(i); /* Now that everything's ready put enough work in the queue */ for (i = 0; i < opt_queue + mining_threads; i++) { @@ -2011,7 +1996,8 @@ int main (int argc, char *argv[]) applog(LOG_INFO, "workio thread dead, exiting."); - delwin(mainwin); + delwin(logwin); + delwin(statuswin); endwin(); refresh();