diff options
Diffstat (limited to 'monitor/mon.c')
-rw-r--r-- | monitor/mon.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/monitor/mon.c b/monitor/mon.c new file mode 100644 index 0000000..8ff2851 --- /dev/null +++ b/monitor/mon.c @@ -0,0 +1,86 @@ +#include <stdlib.h> +#include <unistd.h> + +#include "mon.h" + +int mon_read_prologue(t_mon *mon) { + int i; + + if (fscanf(mon->from_sim, " %d %d\n", &mon->n_inputs, &mon->n_outputs) == EOF) + return -1; + + mon->inputs = malloc(mon->n_inputs * sizeof(t_input)); + mon->outputs = malloc(mon->n_outputs * sizeof(t_output)); + + // Read input description + for (i = 0; i < mon->n_inputs; i++) { + mon->inputs[i].value[0] = '0'; + mon->inputs[i].value[1] = 0; + if (fscanf(mon->from_sim, "%d %s\n", &mon->inputs[i].size, mon->inputs[i].name) == EOF) + return -(i+2); + } + + // Zeroify output description + for (i = 0; i < mon->n_outputs; i++) { + mon->outputs[i].name[0] = 0; + mon->outputs[i].v_bin[0] = 0; + mon->outputs[i].v_int = 0; + } + + mon->step = 0; + mon->status = MS_RUN; + + mon->clk = time(NULL); + + return 0; +} + +void mon_loop(t_mon *mon) { + disp_display(mon); + while (mon->status != MS_FINISH) { + handle_kbd(mon); + if (mon->status == MS_AUTO) { + mon_step(mon); + } else { + usleep(10000); + } + } +} + +void mon_handle_command(t_mon *mon, char *c) { + if (c[0] == 0) { // empty command : run step + mon_step(mon); + } else if (!strcmp(c, "q")) { + mon->status = MS_FINISH; + } else if (!strcmp(c, "a")) { + mon->status = MS_AUTO; + } else if (!strcmp(c, "m")) { + mon->status = MS_RUN; + } +} + +void mon_step(t_mon *mon) { + int i = 0; + + // Get ticker + time_t new_clk = time(NULL); + int ticker = new_clk - mon->clk; + mon->clk = new_clk; + + // Send inputs to simulator + for (i = 0; i < mon->n_inputs; i++) { + fprintf(mon->to_sim, "%s\n", mon->inputs[i].value); + } + + // Read outputs from simulator + for (i = 0; i < mon->n_outputs; i++) { + fscanf(mon->from_sim, "%s %s %d\n", + mon->outputs[i].name, + mon->outputs[i].v_bin, + &mon->outputs[i].v_int); + } + + // Display + mon->step++; + disp_display(mon); +} |