diff options
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/disp.c | 21 | ||||
-rw-r--r-- | monitor/main.c | 6 | ||||
-rw-r--r-- | monitor/mon.c | 14 | ||||
-rw-r--r-- | monitor/mon.h | 2 |
4 files changed, 35 insertions, 8 deletions
diff --git a/monitor/disp.c b/monitor/disp.c index 992c712..84dd941 100644 --- a/monitor/disp.c +++ b/monitor/disp.c @@ -86,19 +86,18 @@ void disp_display(t_mon *mon) { wprintw(wpstatus, "\nInputs:\n"); for (i = 0; i < mon->n_inputs; i++) { - wprintw(wpstatus, " %d. %s%s\t%s (%d)\t%s\n", + wprintw(wpstatus, "%s %d. %s (%d)\t%s\n", + (i == mon->ticker_input ? "T" : (i == mon->ser_in_in ? ">" : " ")), i, - (i == mon->ticker_input ? "T" : ""), - (i == mon->ser_in_in ? ">" : ""), mon->inputs[i].name, mon->inputs[i].size, mon->inputs[i].value); } if (mon->n_inputs == 0) wprintw(wpstatus, "\t(none)\n"); wprintw(wpstatus, "\nOutputs:\n"); for (i = 0; i < mon->n_outputs; i++) { - wprintw(wpstatus, " %d. %s%s\t%s\t%s\t%ld\n", i, - (i == mon->ser_out ? "<" : ""), - (i == mon->ser_in_busy_out ? "!" : ""), + wprintw(wpstatus, "%s %d. %s\t%s %ld\n", + (i == mon->ser_out ? "<" : (i == mon->ser_in_busy_out ? "!" : " ")), + i, mon->outputs[i].name, mon->outputs[i].v_bin, mon->outputs[i].v_int); } if (mon->n_outputs == 0) wprintw(wpstatus, "\t(none)\n"); @@ -147,4 +146,14 @@ void disp_display(t_mon *mon) { } +void disp_display_ser(t_mon *mon) { + if (mon->ser_out_buf != 0) { + wprintw(wpoutput, "%c", mon->ser_out_buf); + wrefresh(wpoutput); + mon->ser_out_buf = 0; + + wmove(wcmdline, 0, cmd_pos + 2); + wrefresh(wcmdline); + } +} diff --git a/monitor/main.c b/monitor/main.c index 1de722c..ff48dcf 100644 --- a/monitor/main.c +++ b/monitor/main.c @@ -36,6 +36,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "(simulator) Could not open mon2sim for reading (%s).\n", strerror(errno)); return 1; } + fprintf(stderr, "(simulator) Syncronization with monitor apparently OK.\n"); execv (argv[1], argv + 1); } @@ -55,6 +56,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "\nError while launching simulator (%d).\n", err); goto finish; } + fprintf(stderr, "(monitor) Syncronization with simulator apparently OK.\n"); // Setup display disp_init(); @@ -65,6 +67,10 @@ int main(int argc, char *argv[]) { // clean up disp_finish(); + if (mon.status == MS_PERROR) { + fprintf(stderr, "(monitor) Exiting due to protocol error.\n"); + } + finish: kill(sim_pid, SIGTERM); waitpid(sim_pid); diff --git a/monitor/mon.c b/monitor/mon.c index 19055c7..780e8ba 100644 --- a/monitor/mon.c +++ b/monitor/mon.c @@ -82,7 +82,7 @@ void mon_loop(t_mon *mon) { int displayer_steps = 0; - while (mon->status != MS_FINISH) { + while (1) { handle_kbd(mon); if (mon->status == MS_AUTO) { mon_step(mon); @@ -125,8 +125,10 @@ void mon_loop(t_mon *mon) { } int sleep = 1000000 / mon->target_freq - mon->calc_time_usec; if (sleep > 0) usleep(sleep); - } else { + } else if (mon->status == MS_RUN) { usleep(10000); + } else { + break; } } } @@ -266,12 +268,19 @@ void mon_step(t_mon *mon) { } // Send inputs to simulator + fprintf(mon->to_sim, "FEED\n"); for (i = 0; i < mon->n_inputs; i++) { fprintf(mon->to_sim, "%s\n", mon->inputs[i].value); } fflush(mon->to_sim); // Read outputs from simulator + int magic; + fscanf(mon->from_sim, " %x", &magic); + if (magic != 0xFED) { + mon->status = MS_PERROR; + return; + } for (i = 0; i < mon->n_outputs; i++) { fscanf(mon->from_sim, " %s %s %d", mon->outputs[i].name, @@ -285,4 +294,5 @@ void mon_step(t_mon *mon) { } mon->step++; + disp_display_ser(mon); } diff --git a/monitor/mon.h b/monitor/mon.h index 0040eda..4430e5f 100644 --- a/monitor/mon.h +++ b/monitor/mon.h @@ -20,6 +20,7 @@ typedef struct { } t_input; typedef enum { + MS_PERROR, MS_FINISH, MS_RUN, MS_AUTO, @@ -61,6 +62,7 @@ typedef struct { void disp_init(); void disp_display(t_mon *mon); +void disp_display_ser(t_mon *mon); void disp_finish(); void handle_kbd(t_mon *mon); |