diff options
Diffstat (limited to 'monitor/mon.c')
-rw-r--r-- | monitor/mon.c | 127 |
1 files changed, 118 insertions, 9 deletions
diff --git a/monitor/mon.c b/monitor/mon.c index 8ff2851..b876559 100644 --- a/monitor/mon.c +++ b/monitor/mon.c @@ -1,13 +1,34 @@ #include <stdlib.h> #include <unistd.h> +#include <string.h> #include "mon.h" +/* + Monitor commands : + (empty cmd) Send input & update output + q Quit + a Set automatic mode (send input all the time) + m Set manual mode (send input when user sends empty command) + i <id> <v> Set input #id to value v (v is a string, transmitted as-is to simulator) + tf Tick fast (send 1 every cycle) + ts Tick for every second + tz Tick zero all the time + t <id> Set ticker input to #id + t Set no ticker input + s <i1> <i2> <i3> Set parameters for serial I/O + i1 : input for serial input + i2 : output for serial input busy signal + i3 : output for serial output + s Set no serial input + :<text> Send text to serial +*/ + 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; + if (fscanf(mon->from_sim, " %d", &mon->n_inputs) == EOF) return -1; + if (fscanf(mon->from_sim, " %d", &mon->n_outputs) == EOF) return -1; mon->inputs = malloc(mon->n_inputs * sizeof(t_input)); mon->outputs = malloc(mon->n_outputs * sizeof(t_output)); @@ -16,8 +37,8 @@ int mon_read_prologue(t_mon *mon) { 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); + if (fscanf(mon->from_sim, " %d", &mon->inputs[i].size) == EOF) return -1; + if (fscanf(mon->from_sim, " %s", mon->inputs[i].name) == EOF) return -1; } // Zeroify output description @@ -31,6 +52,14 @@ int mon_read_prologue(t_mon *mon) { mon->status = MS_RUN; mon->clk = time(NULL); + mon->ticker_input = -1; + mon->ticker_mode = TM_SECOND; + + mon->ser_in_in = -1; + mon->ser_in_busy_out = -1; + mon->ser_out = -1; + mon->ser_buf[0] = 0; + mon->ser_out_buf = 0; return 0; } @@ -47,7 +76,7 @@ void mon_loop(t_mon *mon) { } } -void mon_handle_command(t_mon *mon, char *c) { +void mon_handle_command(t_mon *mon, const char *c) { if (c[0] == 0) { // empty command : run step mon_step(mon); } else if (!strcmp(c, "q")) { @@ -56,29 +85,109 @@ void mon_handle_command(t_mon *mon, char *c) { mon->status = MS_AUTO; } else if (!strcmp(c, "m")) { mon->status = MS_RUN; + } else if (c[0] == 'i') { + const char *p = c + 1; + int a = 0; + while (isspace(*p)) p++; + while (isdigit(*p)) a = a * 10 + (*(p++) - '0'); + if (a >= 0 && a < mon->n_inputs) { + strcpy(mon->inputs[a].value, p); + } + } else if (!strcmp(c, "tf")) { + mon->ticker_mode = TM_FAST; + } else if (!strcmp(c, "ts")) { + mon->ticker_mode = TM_SECOND; + } else if (!strcmp(c, "tz")) { + mon->ticker_mode = TM_NO_TICK; + } else if (c[0] == 't') { + if (c[1] == 0) { + mon->ticker_input = -1; + } else { + const char *p = c + 1; + int a = 0; + while (isspace(*p)) p++; + while (isdigit(*p)) a = a * 10 + (*(p++) - '0'); + + if (a >= 0 && a < mon->n_inputs) { + mon->ticker_input = a; + } + } + } else if (c[0] == 's') { + if (c[1] == 0) { + mon->ser_in_in = mon->ser_in_busy_out = mon->ser_out = -1; + } else { + int u = 0, v = 0, w = 0; + const char *p = c + 1; + while (isspace(*p)) p++; + while (isdigit(*p)) u = u * 10 + (*(p++) - '0'); + while (isspace(*p)) p++; + while (isdigit(*p)) v = v * 10 + (*(p++) - '0'); + while (isspace(*p)) p++; + while (isdigit(*p)) w = w * 10 + (*(p++) - '0'); + if (u >= 0 && u < mon->n_inputs && + v >= 0 && v < mon->n_outputs && + w >= 0 && w < mon->n_outputs) { + mon->ser_in_in = u; + mon->ser_in_busy_out = v; + mon->ser_out = w; + } + } + } else if (c[0] == ':') { + strcat(mon->ser_buf, c + 1); + strcat(mon->ser_buf, "\n"); } + disp_display(mon); } 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; + int ticker = 0; + if (mon->ticker_mode == TM_SECOND) { + time_t new_clk = time(NULL); + ticker = new_clk - mon->clk; + mon->clk = new_clk; + } else if (mon->ticker_mode == TM_FAST) { + ticker = 1; + } + if (mon->ticker_input != -1) { + sprintf(mon->inputs[mon->ticker_input].value, "/%d", ticker); + } + + // Update serial input + if (mon->ser_in_in != -1 && mon->ser_in_busy_out != -1 + && mon->outputs[mon->ser_in_busy_out].v_int == 0) { + if (mon->ser_buf[0] != 0) { + sprintf(mon->inputs[mon->ser_in_in].value, "/%d", (int)mon->ser_buf[0]); + char *p = mon->ser_buf; + while (*p) { + p[0] = p[1]; + p++; + } + } else { + sprintf(mon->inputs[mon->ser_in_in].value, "0"); + } + } // Send inputs to simulator 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 for (i = 0; i < mon->n_outputs; i++) { - fscanf(mon->from_sim, "%s %s %d\n", + fscanf(mon->from_sim, " %s %s %d", mon->outputs[i].name, mon->outputs[i].v_bin, &mon->outputs[i].v_int); } + + // Update serial output + if (mon->ser_out != -1) { + mon->ser_out_buf = mon->outputs[mon->ser_out].v_int; + } // Display mon->step++; |