2 * FILE: $Header: /home/egg/src/RCS/eggui.c,v 1.8 1999/02/28 20:02:54 ghn Exp $
3 * PURPOSE: EGG site user interface
9 * Revision 1.8 1999/02/28 20:02:54 ghn
10 * Version 5.1: The user interface now leaves the cursor at the bottom of
11 * the screen and responds to ^L to redraw the entire screen.
13 * Revision 1.7 1999/01/01 23:58:56 ghn
14 * Take out "CPU_BOUND" conditionals; we won't run CPU_BOUND any more.
16 * Revision 1.6 1998/12/31 22:07:56 ghn
17 * Rev 5 code: includes multi-reg support, HTML, etc.
19 * Revision 1.5 1998/08/03 20:36:28 kelvin
20 * Show time of last data collection by basket.
22 * Revision 1.4 1998/08/01 21:33:28 ghn
23 * Added real implementation for ncursed() based UI for egg.
25 * Revision 1.3 1998/08/01 18:51:25 ghn
26 * Added John's byte-order-independence changes.
28 * Revision 1.2 1998/08/01 17:05:48 ghn
29 * Trivial additions of curses related code.
31 * Revision 1.1 1998/07/21 11:41:23 ghn
34 * Copyright 1998 - Greg Nelson
41 /* Curses takes it upon itself to define TRUE and FALSE,
42 incompatibly, as it happens, with the definitions in
43 global.h. So, clear out the CURSES definitions. */
58 static int32 inittm = 0;
61 extern int32 lastDataSent;
62 extern int32 time_latency, time_housekeeping;
64 /* Initialize user interface, as needed. */
70 intrflush(stdscr, FALSE);
75 printw("Please wait, initializing...");
82 /* Close down user interface */
90 /* Update user interface once on every data collection, receiving the
91 current collection result and CollectRecord. */
92 int32 UIUpdate(int32 cres, CollectRecord *coll) {
96 static double grandavg = 0;
97 static int32 totsamp = 0;
100 if ((i = getch()) != ERR) {
101 if (i == 12) clear();
105 inittm = getzulutime(NULL);
111 if (coll->sampct == 1) {
113 move(line++, 5); printw("Samples per record: %3d", (int)coll->opts.samp_rec);
114 move(line++, 5); printw("Seconds per record: %3d", (int)coll->opts.sec_rec);
115 move(line++, 5); printw("Records per packet: %3d", (int)coll->opts.rec_pkt);
116 move(line++, 5); printw("Bits per trial: %3d", (int)coll->opts.trialsz);
120 if (cres < 0) return ERR_NONE;
124 printw("EGG %s ID %d REG %s %s", eggtable[0].name, eggtable[0].id,
125 configuredREG->reg_name, Version);
127 tmstr = ctime(&inittm); tmstr[strlen(tmstr)-1] = 0;
129 printw("Up since %25s", tmstr);
132 now = getzulutime(NULL);
133 tmstr = ctime(&now); tmstr[strlen(tmstr)-1] = 0;
134 printw("Last sample at %25s", tmstr);
137 tmstr = ctime(&lastDataSent);
138 tmstr[strlen(tmstr)-1] = 0;
139 printw("Last packet at %25s", lastDataSent == 0 ? "Never" : tmstr);
141 /* Note that for a non-CPU_BOUND built, UIUpdate is passed a
142 collection record filled with the last 10 samples collected.
143 Since missing samples do not figure in this record, there
144 is no need to test EGG_MISSING_DATA when computing the
147 /* Show mean since egg started and, each time 10 samples
148 are collected, the mean for the last 10 samples. */
152 grandavg += coll->data.trials[coll->sampct-1]; totsamp++;
155 printw("Grand mean: %6.2f", grandavg);
158 for (recavg = 0, i = 0; i < coll->opts.samp_rec; i++)
159 recavg += coll->data.trials[i];
160 recavg /= coll->opts.samp_rec;
162 printw("Last record mean: %6.2f (%d seconds)", recavg, coll->opts.sec_rec);
164 line++; /* Advance whether we show record mean or not */
166 /* Show latency (lapse between start of second as measured by
167 the computer's clock and when collection of the sample
168 actually began) and time elapsed in housekeeping (saving
169 packets in local files, talking to the basket, updating
170 the user interface, etc.) following collection of the sample.
171 If housekeeping time frequently consumes a substantial portion
172 of the inter-sample interval, the probability of lost
173 samples increases. Both times are shown in milliseconds. */
177 printw("Sampling latency: ");
179 printw("%.3f ms", time_latency / 1000.0);
181 printw("Housekeeping time: ");
183 printw("%.3f ms", time_housekeeping / 1000.0);