summaryrefslogtreecommitdiff
path: root/monitor
diff options
context:
space:
mode:
Diffstat (limited to 'monitor')
-rw-r--r--monitor/disp.c21
-rw-r--r--monitor/main.c6
-rw-r--r--monitor/mon.c14
-rw-r--r--monitor/mon.h2
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);